दिलचस्प पोस्ट
उद्देश्य सी अंतर्निहित रूपांतरण पूर्णांक सटीक 'एनएसयूइन्टेगर' (उर्फ 'अहस्ताक्षरित लंबे') को 'इंट' चेतावनी के लिए खो देता है कंसोल। लिखो धीमा प्रतिक्रिया देने वाली प्रतिक्रियाएं अनचाहे प्रकार प्रकार: त्रुटि: सुपर अभिव्यक्ति या तो रिक्त या फ़ंक्शन होती है, अनिर्धारित नहीं स्विफ्ट में एनएसई एक्सप्शन को पकड़ना ORM का उपयोग करने के क्या फायदे हैं? तुलना की न्यूनतम संख्या के साथ एक सरणी क्रमबद्ध करें पहली संकलन त्रुटि पर स्वचालित रूप से Visual C ++ 2008 बिल्ड बंद करें? कैसे जावा सरणी तर्क घोषणा वाक्यविन्यास "…" काम करता है? आप किस वस्तु का ऑब्जेक्ट ऑब्जेक्ट मूक का उपयोग करते हैं? जावा में किसी मौजूदा फ़ाइल को पाठ की एक नई पंक्ति कैसे जोड़ें? दिनांक समय "शून्य" मान आर में फ़ंक्शन को संपादित करने के लिए कौन से तरीके हैं? पायप्शन में प्लॉटिंग टाइम में मेटप्ललिब के साथ SQL सर्वर में दिनांक की एक श्रेणी कैसे उत्पन्न करें कैसे एक चर से एक जेएस वस्तु संपत्ति नाम सेट करने के लिए

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

क्या यह 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 () पर ले लो।

Solutions Collecting From Web of "फ़ॉर्म लोड अपवाद क्यों नहीं पकड़े?"

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

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

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

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

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

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

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