दिलचस्प पोस्ट
स्थिर संपत्ति के लिए बाध्यकारी संदर्भ के लिए अस्थायी ऑब्जेक्ट और बाइंडिंग रिटर्निंग .NET में NameValueCollection में किसी क्वेरी स्ट्रिंग को कैसे विश्लेषित करें एनएलटीके के साथ एक नया कॉर्पस बनाना ऊपर की ओर स्लाइड करने के लिए एक छवि दृश्य एनिमेट करना एंड्रॉइड में पारदर्शी पृष्ठभूमि के साथ संवाद जावास्क्रिप्ट जो पेज लोड के बाद निष्पादित होता है एक दृश्य नियंत्रक से किसी दूसरे स्विफ्ट का उपयोग कैसे करें क्या आलसी I / O के बारे में बहुत बुरा है? प्रवेश करने के लिए AJAX का उपयोग करते समय पासवर्ड सहेजने के लिए क्रोम को संकेत प्राप्त करना स्ट्रिंग को बूलियन php में कनवर्ट कैसे करें LPARAM और WPARAM की परिभाषा क्या है? क्या उपयोगकर्ता के कैश को असिंक्रोनस में छवियों को लोड करने का एक तरीका है? वेक्टर को एक वेक्टर जोड़ना IDisposable को सही ढंग से कार्यान्वित करना

फ़ॉर्म लोड अपवाद क्यों नहीं पकड़े?

क्या यह Winforms में एक बग है? (दोनों VS2008 और VS2010 पर परीक्षण)

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

थोड़ी देर पहले मुझे उस कोड में कोई त्रुटि नहीं मिली, मैं इस प्रश्न के लिए एक समाधान तैयार करने की कोशिश कर रहा हूं, बीच में अंकों के साथ एक स्ट्रिंग से एक संख्या पार्स करें

और मैं यह कोड फॉर्म 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()); } 

मुझे आश्चर्य है कि उसने नंबर क्यों नहीं दिखाया। फिर बटन को 1 बटन पर ले जाने पर …

 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_लोड ने कोई अपवाद नहीं पकड़ा, क्यों चुपचाप विफल हो? कोड सिर्फ फॉर्म 1_ लोड से बाहर निकलकर स्ट्रिंग t = s.ToCharArray () पर ले लो।

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

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

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

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

इसे देखें: गायब हो जाने वाले ऑनलोड अपवाद के मामले । यह डिज़ाइन (हालांकि अत्यंत-बेवकूफ-डिजाइन, आईएमओ) है। आपका अपवाद ढेर के अन्तराल के दौरान कर्नेल-मोड सीमा को मार रहा है। यदि आप कर सकते हैं, किसी अन्य घटना पर स्विच करें, या अपवाद भागने न दें; यह आपकी मदद नहीं करता है यदि आप अपने डीबगर की स्वचालित रूप से ऑनलोड में एक अप्रबंधित अपवाद पर ब्रेक करने की अपेक्षा कर रहे हैं।

यदि आप ध्यान रखते हैं, तो मैंने इस उत्तर में कुछ और लिखा था।

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

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