यहां मेरा काल्पनिक उदाहरण है। मेरे पास एक बटन के साथ एक बहुत ही सरल WPF विंडो है। बटन। क्लिक घटना में एक हैंडलर है जो इस तरह जाता है।डब्ल्यूपीएफ डिस्पैचर द्वारा अपवादों का प्रचार क्यों नहीं किया जाता है। इन्वोक?
Action doit =() =>
{
Action error =() => { throw new InvalidOperationException("test"); };
try {
this.Dispatcher.Invoke(error, DispatcherPriority.Normal);
} catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex);
throw;
}
};
doit.BeginInvoke(null, null);
मैं उम्मीद होती है कि अपवाद पकड़ लिया और Trace.WriteLine
कॉल से नीचे लिखा जाएगा। इसके बजाए, कोई अपवाद नहीं पकड़ा जाता है और एप्लिकेशन टूट जाता है।
क्या कोई ऐसा होने के लिए संभावित स्पष्टीकरण के बारे में जानता है? और Dispatcher.Invoke
द्वारा प्रस्तावित प्रतिनिधि द्वारा दिए गए अपवादों को पकड़ने के लिए आप क्या कामकाज सुझाते हैं?
अद्यतन 1: मैंने अपवाद हैंडलिंग कोड में throw
डाला। मैं वास्तव में अपवाद को अनदेखा नहीं करना चाहता हूं। मेरे प्रश्न का पूरा बिंदु इसे सही तरीके से संभालना है। समस्या यह है कि अपवाद हैंडलिंग कोड कभी निष्पादित नहीं होता है।
याद रखें कि यह एक काल्पनिक उदाहरण है। मेरा असली कोड ऐसा नहीं दिखता है। साथ ही, मान लें कि मैं कोड को लागू करने के तरीके में कोड नहीं बदल सकता।
अद्यतन 2: इस समान उदाहरण पर विचार करें। एक WPF विंडो के बजाय, मेरे पास एक विंडोज़ फॉर्म विंडो है। इसमें लगभग एक ही हैंडलर के साथ एक बटन है। आमंत्रण कोड में केवल अंतर ही है। यह इस प्रकार चलता है।
this.Invoke(error);
विंडोज फॉर्म में, अपवाद हैंडलिंग कोड निष्पादित किया जाता है। अंतर क्यों?
जिस तरह से मैं पकड़े गए अपवादों से निपट रहा हूं वह अप्रासंगिक है। मैं कुछ लॉगिंग या जो कुछ भी डाल सकता था। समस्या यह है कि अपवाद हैंडलिंग कोड कभी निष्पादित नहीं होता है। – jpbochi
ऐसा इसलिए है क्योंकि अपवाद को किसी अन्य थ्रेड पर फेंक दिया जाता है - 'डिस्पैचर' थ्रेड। –
@ स्टीफन: मुझे यह पता है। मैं एक लक्ष्यInvocationException या इस तरह कुछ पाने की उम्मीद कर रहा था। – jpbochi