2011-05-25 23 views
6

मैं कुछ कोड पर काम कर रहा हूं ताकि HttpWebRequest को असंकालिक रूप से उपयोग किया जा सके। यदि आप में से कोई भी पहले कभी ऐसा कर चुका है, तो आप जानते हैं कि त्रुटि प्रबंधन कुछ दर्द हो सकता है क्योंकि यदि कॉलबैक विधियों में से एक में अपवाद फेंक दिया जाता है, तो इसे किसी कोशिश के माध्यम से कॉलिंग कोड पर वापस नहीं भेजा जा सकता/पकड़ ब्लॉक।सी # में एसिंक्रोनस HttpWebRequest अपवादों को संभालने का सबसे अच्छा तरीका क्या है?

मैं जो करना चाहता हूं वह है कि मेरी कॉल ऑब्जेक्ट में अपवादों को सहेजकर त्रुटियों को संभाल लें जो प्रत्येक कॉलबैक विधि को पास हो जाती है। यदि कोई अपवाद पकड़ा जाता है, तो राज्य ऑब्जेक्ट अपडेट हो जाएगा और फिर http कॉल निरस्त कर दिया जाएगा। मेरी समस्या यह है कि मेरे राज्य वस्तु में, मुझे अपवाद संपत्ति का उपयोग करना होगा ताकि किसी भी प्रकार का अपवाद संग्रहीत किया जा सके। जब कॉलिंग कोड राज्य ऑब्जेक्ट की जांच करता है और अपवाद को "देखता है", तो यह नहीं पता कि यह किस प्रकार का अपवाद है।

क्या मेरे राज्य ऑब्जेक्ट को किसी प्रकार का अपवाद रखने की अनुमति देने का कोई तरीका है, लेकिन फिर भी अपवाद को दृढ़ता से टाइप किया गया है?

राज्य वस्तु

public class HttpPostClientAsyncModel 
    { 
     public HttpResponseSnapshot Response { get; set; } 
     public HttpPostClientAsyncStatus Status { get; set; } 
     public Exception Exception { get; set; } 
     public WebRequest Request { get; set; } 
    } 
+0

बुला कोड सिर्फ एक कोशिश ब्लॉक के अंदर model.Exception फेंक सकते हैं और फिर सेटअप के लिए फैल जाती है विशिष्ट अपवाद उपप्रकार जो कॉलर उचित रूप से संभाल सकता है। या शायद नहीं ... :) – dlev

+0

क्या यह केवल सीखने के अनुभव के लिए है? 'HttpWebRequest.BeginGetResponse' के साथ क्या गलत है? –

उत्तर

1

अपवाद वस्तु अभी भी दृढ़ता से टाइप किया और अपने मूल क्षेत्र मूल्यों को बरकरार रखे हुए है। आप सभी की जरूरत इस तरह यह जाँच करने के लिए है:

if (asyncModel.Exception is ArgumentException) 
{ 
    // Handle argument exception here 
    string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName; 
} 
else if (...) 
{ 
} 

आप आम तौर पर आज़माएं/कैच ब्लॉक के साथ एक बहुत समान जांच वैसे भी करना होगा तो यह असुविधाजनक नहीं होना चाहिए। आप इस बारे में वास्तव में चिंतित हैं, बस समन्वयन विधियों के साथ एक नया धागा बना सकते हैं और निरंतरता विकल्पों के साथ अपवाद संभाल:

Task.Factory.StartNew(() => { DoWork(); }) 
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception), 
TaskContinuationOptions.OnlyOnFaulted); 
संबंधित मुद्दे

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