2015-01-20 17 views
5

MessageBox.Show नीचे कॉल "आंतरिक" दिखाता है। क्या यह एक बग है?नियंत्रण। इन्वोक बाहरी अपवाद को अनचाहे करता है और इसके बजाय आंतरिक अपवाद का प्रचार करता है

private void Throw() 
{ 
    Invoke(new Action(() => 
    { 
     throw new Exception("Outer", new Exception("Inner")); 
    })); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Throw(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); // Shows "Inner" 
    } 
} 
+1

मुझे लगता है कि 'प्रतीक्षा टास्क.रुन()' प्रासंगिक नहीं है। आपको इसे अपने प्रश्न से छोड़ देना चाहिए, क्योंकि यह केवल उस मुद्दे से विचलित होता है जिसके बारे में आप पूछ रहे हैं। –

+0

यह दिलचस्प है। अगर हम अभी तक एक और आंतरिक अपवाद जोड़ते हैं, तो यह हमें भी देगा। – Chris

+0

फ्लैगर्स: इसे [इस दूसरे एक] के डुप्लिकेट के रूप में फ़्लैग करने से पहले वास्तव में प्रश्न को पढ़ने की देखभाल करें (http://stackoverflow.com/questions/15704711/how-can-i-use-control-invoke-to-throw- एक-अपवाद-कि-अभ्यस्त होने वाली नजरअंदाज कर दिया)? – Juan

उत्तर

5

मैं System.Windows.Forms.Control के लिए संदर्भ स्रोत पर एक नज़र, और कोड कि Invoke के साथ संबंधित था इस तरह दिखता है:

try { 
    InvokeMarshaledCallback(current); 
} 
catch (Exception t) { 
    current.exception = t.GetBaseException(); 
} 

GetBaseException:

public virtual Exception GetBaseException() 
{ 
    Exception inner = InnerException; 
    Exception back = this; 

    while (inner != null) { 
     back = inner; 
     inner = inner.InnerException; 
    } 

    return back; 
} 

तो जाहिरा तौर पर यह इस तरह है डिजाइन द्वारा। स्रोत में टिप्पणियां इस बारे में कोई स्पष्टीकरण नहीं देती हैं कि वे ऐसा क्यों करते हैं।

संपादित करें: कुछ साइट है कि अब दावों इस टिप्पणी माइक्रोसॉफ्ट पर एक आदमी से आया है चला गया है:

रिकॉर्ड में WinForm comfirmation के आधार पर, हमारे विश्लेषण मूल कारण की सही है और इस व्यवहार है इरादा है। कारण उपयोगकर्ता को बहुत अधिक विंडोज़ देखने से रोकता है। फर्म आंतरिक तंत्र। ऐसा इसलिए है क्योंकि Winform का डिफ़ॉल्ट त्रुटि संवाद अपवाद विवरण दिखाने के लिए एप्लिकेशन। थ्रेड अपवाद भी प्रदान करता है। .Net Winform टीम अन्य अपवाद जानकारी को ट्रिम करती है ताकि डिफ़ॉल्ट त्रुटि संवाद अंतिम उपयोगकर्ता को सभी विवरण प्रदर्शित नहीं करेगा।

इसके अलावा, कुछ एमएसएफटी ने इस व्यवहार को बदलने के लिए सुझाव दिया है। हालांकि, .Net विनफॉर्म टीम सोचती है कि फेंकने के लिए अपवाद बदलना परिवर्तन है और इसी कारण से WinForms एप्लिकेशन के लिए सबसे निचले अपवाद भेजते रहेंगे। थ्रेडएक्सप्शन हैंडलर।

+1

मुझे लगता है कि इस विषय पर दो अब-शुद्ध कनेक्ट रिपोर्ट भी हैं, पहले यूआरएल पर http://connect.microsoft.com/VisualStudio/feedback/details/386582/control-invoke-exception-handling और http: // connect.microsoft.com/VisualStudio/feedbackdetail/view/433765/control-invoke-throws-exception-getbaseexception-rather-than-the-actual-exception (यदि आप उन लिंक पर जाने का प्रयास करते हैं, तो वेब साइट रिपोर्ट करता है कि पृष्ठ हैं चला गया या निषिद्ध)। आप "control.invoke आंतरिक अपवाद" के साथ एमएसडीएन खोजकर और सारांश को देखकर प्रत्येक के छोटे स्निपेट देख सकते हैं। –

+0

अच्छा निष्कर्ष। हालांकि आईएसएसपीवाई में वह कोड नहीं मिला। – Juan

+1

@ जुआन 'System.Windows.Forms.Control' के तहत' InvokeMarshaledCallbacks() 'देखें। – Chris

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