Application.ThreadException और AppDomain.CurrentDomain.UnhandledException में क्या अंतर है?


107

ठीक है, यह एक आसान है:

  • बीच क्या अंतर है Application.ThreadExceptionऔर
    AppDomain.CurrentDomain.UnhandledException?

  • क्या मुझे दोनों को संभालने की आवश्यकता है?

धन्यवाद!

जवाबों:


98

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

वह बैकस्टॉप Application.ThreadException इवेंट को फायर करता है । यदि आप इसे ओवरराइड नहीं करते हैं, तो उपयोगकर्ता को एक ThreadExceptionDialog मिलेगा । जो उसे अपवाद को अनदेखा करने और आपके कार्यक्रम को चलाने की अनुमति देता है। नहीं एक महान विचार btw।

आप Program.cs में मुख्य () विधि में Application.SetUnhandledExceptionMode () कॉल करके इस व्यवहार को अक्षम कर सकते हैं । जगह में उस बैकस्टॉप के बिना, सामान्य बात तब होती है जब एक धागा एक अखंड अपवाद से मर जाता है: AppDomain.UnhandledException आग और कार्यक्रम समाप्त हो जाता है।

Fwiw: "ThreadException" एक बहुत ही खराब नाम था। इसका धागों से कोई लेना-देना नहीं है।


और कैसे WinForms आवेदन को रोकने की घटना पर दुर्घटनाग्रस्त होने से रोकने के लिए Application.ThreadException। मैंने अपने छोटे सी # कोड के साथ [यहां ] इसके लिए एक सवाल उठाया ।
महेश999

2
मैं हमेशा इसे एप्लिकेशन-थ्रेड अपवाद के रूप में पढ़ता हूं, यह देखते हुए कि विनफॉर्म एक सिंगल थ्रेड के लिए बाध्य है।
गुस्सोर

36

से स्रोत :

विंडोज फॉर्म का उपयोग करने वाले अनुप्रयोगों में, मुख्य एप्लिकेशन थ्रेड में बिना किसी अपवाद के 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 देखें ।


18

ठीक है - मेरे सामने यह था, एमएसडीएन का यह कोड बहुत ही आत्म-व्याख्यात्मक है:

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());
}

3
जब वह कहता है कि यह सर्हियो के अन्य उत्तर के विपरीत है: UnhandledExceptionMode.ThrowException को थ्रेडएक्ससेप्शन ईवेंट हैंडलर को हुक करने से पहले सेट किया जाना चाहिए। यकीन नहीं होता अगर आदेश वास्तव में मायने रखता है ...
डेविड पिरस

@DavidePiras हाँ, और वहाँ कुछ और अधिक नकली है। SetUnhandledException को मेरे मामले में कोई फर्क नहीं पड़ता है।
नवफाल

0

अच्छी तरह से बात है, ThreadExceptionअपने धागे के साथ एक समस्या के कारण होता है, Unhandled Exceptionनिकाल दिया जाता है यदि आप एक अपवाद को फेंक देते हैं जो संभाला नहीं जाता है।

दूसरा तरीका आसान करने के लिए कोई प्रयास नहीं के साथ एक ऐप बनाना है ... ब्लॉक पकड़ें और एक अपवाद फेंकें।

अब यदि आपको बीमा की आवश्यकता है तो आप उन दोनों को संभाल सकते हैं, हालांकि यदि आप कब्जा करते हैं और exceptionsसही ढंग से संभालते हैं तो आपको UnhandledExceptionहैंडलर की आवश्यकता नहीं होनी चाहिए क्योंकि यह सभी को पकड़ने की तरह है।


धन्यवाद - क्या मैं बहुत स्पष्ट नहीं था, अगर मैं
हैंडहेल्ड अपवाद को पकड़ता तो मैं थ्रेडएक्ससेप्शन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.