2011-03-21 12 views
5

मेरे पास एक ऐसा प्रोग्राम है जो बाहरी वेब सेवा कहता है, और मैं उपयोगकर्ता को एक दोस्ताना संवाद के साथ प्रस्तुत करना चाहता हूं यदि उदा। सर्वर डाउन है, किसी केबल आदि में कटौती के लिए निम्न कोडडब्ल्यूसीएफ वेब सेवा कॉल - कौन सा अपवाद पकड़ने के लिए?

try { 
    client.MyWebService() 
} 
catch(? ex) 
{ 
    // display friendly dialog explaining what went wrong 
} 

क्या अपवाद (रों) मैं कोड में प्रश्न चिह्न के स्थान पर रखना चाहिए मान लिया जाये? वास्तव में इस तरह की परिस्थितियों का परीक्षण करना मुश्किल होता है जब सबकुछ सुचारू रूप से काम कर रहा है और मेरे बाहरी हिस्से पर कोई नियंत्रण नहीं है, इसलिए कुछ अंतर्दृष्टि की सराहना की जाएगी।

धन्यवाद!

+0

यदि आप कुछ विशिष्ट परिदृश्यों को आजमा देना चाहते हैं, तो ... बस उन्हें आज़माएं और देखें कि क्या होता है? कुछ हिस्सों में, उत्तर इस बात पर निर्भर करता है कि जानकारियों के अलावा किसी भी विवरण को रिसाव करना कितना महत्वपूर्ण नहीं है - यानी यह दिखाने के लिए ठीक है कि "ओह कुछ गलत हो गया" + ex.Message –

+0

हालांकि यह एक सुरक्षा दृष्टिकोण से ठीक हो सकता है " ओह ... "संदेश, मैं कुछ और अधिक विशिष्ट पसंद करेंगे। – Eyvind

+3

"महिला दो दरवाजे नीचे कुछ घर का काम कर रही है, और जिम, वर्तमान में साइट पर मौजूद दो श्रमिकों के लम्बे समय तक, गलती से जंक्शन-बॉक्स के माध्यम से एक छिद्र लगाया गया है; एक दूरसंचार इंजीनियर को बुलाया गया है, लेकिन पहले 2 अन्य नौकरियां हैं, प्लस उस वैटबॉल-सब को अपने वैन में खाना चाहता है; इसे 14:12 तक हल किया जाएगा "- सुनिश्चित नहीं है कि इसके लिए एक विशिष्ट अपवाद है ...; पी –

उत्तर

5

करने के लिए पहली बात यह है आपके प्रॉक्सी, पर .Faulted घटना का लाभ लेने के आप इस तरह तार कर सकते हैं जो:

((ICommunicationObject)client).Faulted += new EventHandler(client_Faulted); 

अपने client_Faulted ईवेंट हैंडलर में आप तो फिर से कोशिश कर सकते हैं कनेक्ट करना, या बैकअप सर्वर में स्थानांतरित करना, या यूआई को अक्षम करना, त्रुटि लॉग करना, या वहां एक संदेश प्रदर्शित करना।

यह भी स्पष्ट रूप से एक अच्छा प्रयास है कि प्रत्येक कॉल को ट्राइक-कैच में भी लपेटें, लेकिन फॉल्टेड इवेंट आपको पहले भी अधिकांश चैनल समस्याओं से निपटने दे सकता है।

अपवाद के लिए, आप अपनी सेवा FaultException फेंक सकते हैं जो आपके द्वारा प्रदान किए गए विवरण के साथ ग्राहक को वापस भेज दिया जाता है। this blog posting पर इसके उपयोग का एक उदाहरण देखें।

यदि चैनल स्वयं विफल रहता है तो आपको FaultException नहीं मिलेगा (FaultException सर्वर के लिए अपने आंतरिक दोषों को संवाद करने का एक तरीका है)।

चैनल दोषों के लिए, आपको CommunicationException या TimeoutException मिल सकता है।

अंत में, अपवाद हैंडलिंग डब्ल्यूसीएफ प्रॉक्सी उत्पन्न करने के लिए कोडेप्लेक्स पर this project पर एक नज़र डालें। यह आपको दोषों को सौंपने का एक अधिक लचीला तरीका दे सकता है।

1

यह वास्तव में जितना संभव हो उतना विस्तार प्रदान करने के लिए ग्राहक का काम नहीं है। क्लाइंट साइड पर आपको जितनी अधिकतम राशि प्रदान करना है उतना ही उतना ही है जितना आप अपने अपवाद में वापस लेते हैं।

var userName = "bob"; 
try 
{  
    client.MyWebService(userName); 
} 
catch(Exception ex) 
{ 
    //Maybe we know WellKnownExceptions and can provide Foo advice: 
    if (ex is WellKnownException) 
    { 
     Console.WriteLine("WellKnownException encountered, do Foo to fix Bar."); 
    } 
    //otherwise, this is the best you can do: 
    Console.WriteLine(string.Format(
     "MyWebService call failed for {0}. Details: {1}", userName, ex)); 
} 
+3

यदि आपको पता है कि यह वेलकॉउन एक्सेप्शन फेंक सकता है, तो आप उसे एक अलग 'पकड़ (WellKnownException wkex) 'ब्लॉक बनाना चाहिए। –

+0

@CLaw: यह शैली का मामला है। अपवाद प्रकार के आधार पर यदि आप प्रत्येक के पास अपना स्वयं का पकड़ ब्लॉक था, तो आप इस शैली में तर्कसंगत और अधिक तर्कसंगत कर सकते हैं। मेरा उदाहरण वास्तव में यह प्रदर्शित नहीं करता है, यद्यपि। –

संबंधित मुद्दे