2010-07-09 15 views
13

क्या यह Winforms में एक बग है?क्यों फॉर्म लोड अपवाद नहीं पकड़ सकता है?

private void Form1_Load(object sender, EventArgs e) 
{ 
    throw new Exception("Hey");    
} 

मुझे लगता है कि कोड में किसी भी त्रुटि प्राप्त नहीं होता है (दोनों VS2008 और VS2010 पर परीक्षण), कुछ समय पहले, मैं इस सवाल Parse a number from a string with non-digits in between

के लिए एक समाधान तैयार करने के लिए कोशिश कर रहा हूँ और मैं इस कोड को करना फॉर्म 1_ लोड में:

private void Form1_Load(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

मुझे आश्चर्य है कि यह संख्या क्यों नहीं दिखाया। तब button1_Click करने के लिए कोड ...

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

जाने पर ... तो मैंने देखा उसमें कोई त्रुटि है कि: इनपुट स्ट्रिंग एक सही स्वरूप में नहीं था।

क्यों फॉर्म 1_लोड को कोई अपवाद नहीं मिला, यह चुपचाप विफल क्यों हुआ? कोड स्ट्रिंग टी = एस.ToCharArray() पर form1_load से बाहर निकलें कोड ले लो ...

+1

मैंने अपने Win7 SP1 x64 विकास मशीन पर इस व्यवहार को सफलतापूर्वक सही कर दिया है। कैसे [यह जवाब] देखें (http://stackoverflow.com/a/11997142/119527) कैसे। –

उत्तर

21

रिवाइट, मैंने यह पता लगाया है कि यह कहां से आता है। जब विंडोज 7 के 64-बिट संस्करण पर चलता है तो 32-बिट प्रक्रिया में अपवाद उठाया जाता है, तो विंडोज गलत व्यवहार करता है। यह उस कोड द्वारा उठाए गए अपवाद को निगलता है जो 64-बिट विंडोज मैनेजर द्वारा ट्रिगर किए गए Windows संदेश के जवाब में चलता है । WM_SHOWWINDOW की तरह, वह संदेश जो लोड ईवेंट को उठाने का कारण बनता है।

डीबगर एक भूमिका निभाता है क्योंकि जब यह सक्रिय होता है, तो Winforms ऐप में फंसने वाला सामान्य अपवाद बंद हो जाता है ताकि डीबगर को अपवाद पर रोक दिया जा सके। यह इस परिदृश्य में नहीं होता है क्योंकि विंडोज 7 अपवाद को पहले निगलता है, डीबगर को इसे देखने से रोकता है।

मैंने संभावित समस्या के साथ this answer में इस समस्या के बारे में अधिक व्यापक रूप से लिखा है।

+0

में एक बग लगता है। जबकि वीएस के अंदर यह चुपचाप विफल रहता है, इसमें कोई अपवाद नहीं होता है। अगर स्वतंत्र रूप से चलाया जाता है, तो यह अपवाद पकड़ने में सक्षम है – Hao

-1

WinForms फ्रेमवर्क कक्षाएं स्वचालित रूप से आपके लिए कोई अपवाद नहीं पकड़ेंगी। यह एक बग नहीं है, यह डिजाइन द्वारा है - अपवाद के साथ वे क्या करेंगे?

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

+0

उपरोक्त मेरे कोड को निष्पादित करने का प्रयास करें। फॉर्म 1_लोड में ** ** नया अपवाद ("अरे यो!") ** के व्यवहार के विपरीत और जब यह बटन 1_Click – Hao

5

इसे देखें: The case of the disappearing OnLoad exception। यह डिज़ाइन है (हालांकि बेहद बेवकूफ-डिजाइन, आईएमओ)। आपका अपवाद स्टैक की अनदेखी के दौरान कर्नेल-मोड सीमा को मार रहा है। यदि आप कर सकते हैं, तो किसी अन्य घटना पर स्विच करें, या अपवादों को बचने न दें; यह आपकी मदद नहीं करता है अगर आप अपने डीबगर को ऑनलोड में एक अन-हैंडल अपवाद पर स्वचालित रूप से तोड़ने की उम्मीद कर रहे हैं।

यदि आप परवाह करते हैं, तो मैंने थोड़ा और in this answer लिखा था।

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