2008-12-11 9 views
5

यह एक वेब सेवा विधि रैप करने के लिए/एक आज़माएं/कैच ब्लॉक में फोन सबसे अच्छा अभ्यास है?आज़माएं/कैच ब्लॉक में एक वेब सेवा रैपिंग

क्या वेब सेवा अनुरोध नहीं है कि .NET डेस्कटॉप अनुप्रयोगों का क्रैश क्यों होता है? तो मैं सोच रहा था कि सभी कॉल को रोकने के लिए कोशिश/पकड़ में लपेटा जाना चाहिए।

अच्छा विचार है?

इसके अलावा, क्या इसे अपवाद फेंकना चाहिए या सिर्फ खाली पकड़ होना चाहिए?

उत्तर

4

मुझे लगता है कि आप डब्ल्यूसीएफ का उपयोग कर रहे हैं, क्योंकि आपका प्रश्न इसके साथ टैग किया गया है। डब्लूएफसी के साथ अपवाद हैंडलिंग में एक अच्छा अभ्यास अपवाद को आपके उपभोक्ता को तार भरने के लिए अनुमति नहीं दे रहा है, बल्कि इसके बजाय सार्थक FaultExceptions को फेंक देता है।

आपको हमेशा प्रयास करना चाहिए ... अगर आपके पास कोई अपवाद उत्पन्न हो सकता है तो आपके ऑपरेशन में ब्लॉक को पकड़ें। आप बुलबुला के लिए कच्चे excption अनुमति देते हैं, केवल दो स्थितियों परिणाम कर सकते हैं: आप अपनी सेवा दोष में अपवाद विवरण देने के लिए कॉन्फ़िगर किया है, तो आप अपनी सेवा उद्घाटन अपने आप को सुरक्षा उल्लंघनों के लिए के आंतरिक सामने आ जाएगी। या आप यह आपकी सेवा में विन्यस्त और उपभोक्ता है जो उन्हें या सहायता टीम के लिए बहुत उपयोगी नहीं है एक बहुत ही सामान्य संदेश बताता है कि कुछ गलत हो गया, हो जाता है नहीं है।

आपको क्या करना चाहिए एक या अधिक FaultExceptions घोषित, क्या संदेश आप उपयोगकर्ता चाहते हैं पर निर्भर करता है आपके ऑपरेशन से प्राप्त करने के लिए, उन्हें अपने आपरेशन घोषणा पर FaultContracts के रूप में सजाने के लिए है। फिर आप कोशिश कर सकते हैं ... विशिष्ट अपवादों को पकड़ें और विशिष्ट दोषों को फेंक दें। आप भी कोशिश कर सकते हैं ... कैच अपवाद पकड़ता है और एक बहुत ही सामान्य फॉल्ट फेंक देता है।

यहां कुंजी, आंतरिक रूप से आपके ऑपरेशन के साथ क्या चल रहा है, इस बारे में बहुत अधिक जानकारी प्रकट नहीं कर रही है - विशेष रूप से स्टैक निशान!

गलती सिर्फ एक और डेटा अनुबंध है, इसलिए इसे आपके डब्लूएसडीएल में घोषित किया गया है। इसका मतलब है कि आपका उपभोक्ता विशेष रूप से गलती को पकड़ सकता है और आपके ऑपरेशन से फंसे दोषों पर प्रतिक्रिया कर सकता है जैसे कि यह उनके कोड से फेंक दिया गया अपवाद था।

उम्मीद है कि इससे मदद मिलती है।

जो।

0

यह एक ऐसा मामला है जिसके परिणामस्वरूप अपवाद फेंक दिया जा सकता है, इसलिए हाँ इसे एक कोशिश पकड़ने वाले ब्लॉक पर लपेटा जाना चाहिए।

क्या अपवाद संचालक यह कार्यक्रम तर्क पर निर्भर करता है के साथ क्या करना ...

0

एक कोशिश पकड़ ब्लॉक में एक वेब सेवा विधि लाना एक अच्छा विचार है, जैसा कि आप ने कहा आप बुला दुर्घटना नहीं करना चाहते आवेदन क्योंकि वेब सेवा विधि में कुछ गड़बड़ हुई।

इसके अतिरिक्त, क्लाइंट को अपवाद फेंकने के बजाय, जो इसके बारे में कुछ भी नहीं कर सकता है, आप अपने सभी वेब सेवा विधियों को एक संरचना या छोटी कक्षा लौटने पर विचार कर सकते हैं जिसमें कॉल की स्थिति हो सकती है , एक त्रुटि कोड और एक दोस्ताना संदेश जो त्रुटि की व्याख्या कर सकता है।

1

हाँ, आप कोशिश पकड़ में वेब सेवा कॉल लपेट चाहिए। खाली पकड़ का उपयोग न करें क्योंकि वे (ज्यादातर) शुद्ध बुराई हैं। आपके कैच ब्लॉक को कम से कम अपवाद लॉग अप करना चाहिए। मैं अपने अनुप्रयोगों के तर्क के बारे में पता नहीं है, लेकिन शायद कुछ संदेश उपयोगकर्ता को दिखाया जाना चाहिए (जैसे "सेवा से जानकारी तकनीक त्रुटि के कारण नहीं लाया गया,")।

2

यह ठीक है, लेकिन केवल अपवाद प्रकारों को पकड़ने का प्रयास करें जिन्हें आप संभाल सकते हैं।

किसी भी "अपवाद" को पकड़ने से बचें या, यदि आप ऐसा करते हैं, तो उपयोगकर्ता को लॉग इन करें और/या चेतावनी दें और/या webservice को कॉल करने के लिए पुनः प्रयास करें।

यदि यह एक विंडोज़ फॉर्म ऐप है तो मैं आमतौर पर डिफगिंग या परीक्षण करते समय अपवाद छिपाने से बचने के लिए #if DEBUG ब्लॉक में अंतिम "अपवाद" पकड़ को लपेटता हूं।

#if !DEBUG 
catch (Exception ex) 
{ 
    // show messagebox, log, etc 
} 
#endif 
1
using System; 
using System.ServiceModel; 
using Entities; //my entities 
using AuthenticationService; //my webservice reference 

namespace Application.SL.Model 
{ 
    public class AuthenticationServiceHelper 
    { 
     /// <summary> 
     /// User log in 
     /// </summary> 
     /// <param name="callback"></param> 
     public void UserLogIn(Action<C48PR01IzhodOut, Exception> callback) 
     { 
      var proxy = new AuthenticationServiceClient(); 

     try 
     { 
      proxy.UserLogInCompleted += (sender, eventargs) => 
      { 
       var userCallback = eventargs.UserState as Action<C48PR01IzhodOut, Exception>; 
       if (userCallback == null) 
        return; 

       if (eventargs.Error != null) 
       { 
        userCallback(null, eventargs.Error); 
        return; 
       } 
       userCallback(eventargs.Result, null); 
      }; 
      proxy.UserLogInAsync(callback); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
      ErrorHelper.WriteErrorLog(ex.ToString()); 
     } 
     finally 
     { 
      if (proxy.State != CommunicationState.Closed) 
      { 
       proxy.CloseAsync(); 
      } 
     } 
     } 
} 

क्या यह एक अच्छा अभ्यास है या सुधार के लिए जगह है?