जवाबों:
Application.ThreadException Windows प्रपत्र के लिए विशिष्ट है। विन्डोज़ द्वारा भेजे गए संदेशों के जवाब में Winform ईवेंट हैंडलर चलाता है। उदाहरण के लिए घटना पर क्लिक करें, मुझे यकीन है कि आप उन्हें जानते हैं। अगर ऐसी घटना हैंडलर अपवाद छोड़ती है, तो Winforms संदेश लूप के अंदर एक बैक-स्टॉप है जो उस अपवाद को पकड़ता है।
वह बैकस्टॉप Application.ThreadException इवेंट को फायर करता है । यदि आप इसे ओवरराइड नहीं करते हैं, तो उपयोगकर्ता को एक ThreadExceptionDialog मिलेगा । जो उसे अपवाद को अनदेखा करने और आपके कार्यक्रम को चलाने की अनुमति देता है। नहीं एक महान विचार btw।
आप Program.cs में मुख्य () विधि में Application.SetUnhandledExceptionMode () कॉल करके इस व्यवहार को अक्षम कर सकते हैं । जगह में उस बैकस्टॉप के बिना, सामान्य बात तब होती है जब एक धागा एक अखंड अपवाद से मर जाता है: AppDomain.UnhandledException आग और कार्यक्रम समाप्त हो जाता है।
Fwiw: "ThreadException" एक बहुत ही खराब नाम था। इसका धागों से कोई लेना-देना नहीं है।
से स्रोत :
विंडोज फॉर्म का उपयोग करने वाले अनुप्रयोगों में, मुख्य एप्लिकेशन थ्रेड में बिना किसी अपवाद के
Application.ThreadException
घटना को उठाया जाता है। यदि इस ईवेंट को नियंत्रित किया जाता है, तो डिफ़ॉल्ट व्यवहार यह है कि अनहेल्ड किए गए अपवाद एप्लिकेशन को समाप्त नहीं करते हैं, हालांकि एप्लिकेशन को अज्ञात स्थिति में छोड़ दिया गया है। उस स्थिति में,UnhandledException
घटना को उठाया नहीं गया है। एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल का उपयोग करके या इवेंट हैंडलर को हुकApplication.SetUnhandledExceptionMode
करनेUnhandledExceptionMode.ThrowException
से पहले मोड को बदलने के लिए विधि का उपयोग करके इस व्यवहार को बदला जा सकता हैThreadException
। यह केवल मुख्य एप्लिकेशन थ्रेड पर लागू होता है। इसUnhandledException
घटना को अन्य धागों में पिरोए गए अपवादों के लिए उठाया गया है।विज़ुअल स्टूडियो 2005 के साथ शुरू , विजुअल बेसिक एप्लिकेशन फ्रेमवर्क मुख्य एप्लिकेशन थ्रेड में अनहेल्डेड अपवाद के लिए एक और घटना प्रदान करता है -
WindowsFormsApplicationBase.UnhandledException
। इस घटना में AppDomain.UnhandledException द्वारा उपयोग किए गए ईवेंट तर्क ऑब्जेक्ट के समान नाम के साथ इवेंट तर्क ऑब्जेक्ट है, लेकिन विभिन्न गुणों के साथ। विशेष रूप से, इस घटना के तर्क वस्तु में एकExitApplication
संपत्ति है जो आवेदन को जारी रखने की अनुमति देता है, अनजाने अपवाद को अनदेखा करता है (और एक अज्ञात स्थिति में आवेदन को छोड़ देता है)। उस स्थिति में, AppDomain.UnhandledException इवेंट नहीं उठाया गया है।
Application.ThreadException
पकड़ा जा सकता है और आवेदन जारी रह सकता है (सामान्य रूप से यह एक महान विचार नहीं है, लेकिन समय-समय पर कुछ कार्यों को चलाने जैसे आवेदन के लिए यह एक अच्छा समाधान है)।
उन अपवादों को पकड़ने के लिए जो विंडोज फॉर्म द्वारा निर्मित और स्वामित्व में नहीं होते हैं, उनका उपयोग करें AppDomain.UnhandledException
। यह एप्लिकेशन को अपवाद के बारे में जानकारी लॉग करने की अनुमति देता है इससे पहले कि सिस्टम डिफॉल्ट हैंडलर उपयोगकर्ता को अपवाद की रिपोर्ट करता है और एप्लिकेशन को समाप्त कर देता है।
इस अपवाद को संभालने से एप्लिकेशन को समाप्त होने से नहीं रोका जा सकता है।
अधिकतम जो किया जा सकता है (कार्यक्रम डेटा दूषित हो सकता है जब अपवादों को नियंत्रित नहीं किया जाता है) बाद में पुनर्प्राप्ति के लिए प्रोग्राम डेटा को सहेज रहा है। उसके बाद एप्लिकेशन डोमेन अनलोड किया जाता है और एप्लिकेशन समाप्त हो जाता है।
.NET 4 के साथ शुरू , यह घटना अपवादों के लिए नहीं उठती है जो प्रक्रिया की स्थिति को भ्रष्ट करती है, जैसे कि स्टैक ओवरफ्लो या एक्सेस उल्लंघन, जब तक कि ईवेंट हैंडलर सुरक्षा-महत्वपूर्ण नहीं होता है और इसकी
HandleProcessCorruptedStateExceptionsAttribute
विशेषता होती है।
अधिक जानकारी के लिए, MSDN देखें ।
ठीक है - मेरे सामने यह था, एमएसडीएन का यह कोड बहुत ही आत्म-व्याख्यात्मक है:
public static void Main(string[] args)
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms
// errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Runs the application.
Application.Run(new ErrorHandlerForm());
}
अच्छी तरह से बात है, ThreadException
अपने धागे के साथ एक समस्या के कारण होता है, Unhandled Exception
निकाल दिया जाता है यदि आप एक अपवाद को फेंक देते हैं जो संभाला नहीं जाता है।
दूसरा तरीका आसान करने के लिए कोई प्रयास नहीं के साथ एक ऐप बनाना है ... ब्लॉक पकड़ें और एक अपवाद फेंकें।
अब यदि आपको बीमा की आवश्यकता है तो आप उन दोनों को संभाल सकते हैं, हालांकि यदि आप कब्जा करते हैं और exceptions
सही ढंग से संभालते हैं तो आपको UnhandledException
हैंडलर की आवश्यकता नहीं होनी चाहिए क्योंकि यह सभी को पकड़ने की तरह है।
Application.ThreadException
। मैंने अपने छोटे सी # कोड के साथ [यहां ] इसके लिए एक सवाल उठाया ।