2009-08-19 15 views
6

यह previous question से संबंधित है।ऐपडोमेन अपवाद हमेशा आवेदन को समाप्त क्यों करते हैं?

जो मैं अब समझने की कोशिश कर रहा हूं यह है कि यूआई थ्रेड अपवादों को एप्लिकेशन को समाप्त करने से कैसे रोका जा सकता है जबकि गैर-यूआई अपवाद नहीं हो सकते हैं।

संदर्भ के लिए, this example देखें।

सबसे महत्वपूर्ण बात यह है कि मैं उस मामले में "चुपचाप" प्रक्रिया को समाप्त कर सकता हूं - विंडोज संवाद बॉक्स को प्रदर्शित किए बिना पूछता है कि मैं एक त्रुटि रिपोर्ट भेजना चाहता हूं या नहीं।

यह मेरा AppDomain UnhandledExceptionHandler है:

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{    
    try 
    { 
     // Maybe do some logging here if allowed 
    } 
    catch 
    { 
    } 

    // then just terminate the application 
    Application.Exit();    
} 

अद्यतन
this answer में टिप्पणी के प्रकाश में, मैं स्पष्ट करना है कि सबसे महत्वपूर्ण बात मैं तंत्र के बारे में और अधिक जानकारी प्राप्त करना चाहते हैं करना चाहते हैं कि यूआई थ्रेड को Application.ThreadException तंत्र के माध्यम से अनचाहे अपवादों को पकड़ने का प्रारंभिक अवसर प्राप्त करने में सक्षम बनाता है। और क्या ऐसा व्यवहार गैर-यूआई थ्रेड पर लागू किया जा सकता है।

उत्तर

7

तो, गूगल पर कुछ और खोज करने के बाद मैं इस बहुत ही दिलचस्प व्याख्या यह है कि के रूप में Jeff Atwood on his blog द्वारा वर्णित एक ही समस्या को दिया गया था पाया।

हाय सब, भ्रम के लिए खेद है। यह व्यवहार वास्तव में डिज़ाइन है, हालांकि डिजाइन कभी-कभी थोड़ा सा हो सकता है।

समझने वाली पहली बात यह है कि UnhandledException ईवेंट एक अनचाहे अपवाद "हैंडलर" नहीं है। घटना के लिए पंजीकरण, दस्तावेज़ीकरण के विपरीत क्या है :-(, अनचाहे अपवादों को संभालने का कारण नहीं बनता है। (तब से वे अनचाहे नहीं होंगे, लेकिन मैं पहले से ही परिपत्र तर्क के साथ रुक जाऊंगा ...) UnhandledException घटना बस आपको सूचित करता है कि एक अपवाद बिना क्रिया चला गया है, के मामले में आप अपने धागा या आवेदन मर जाता है। FWIW से पहले राज्य को बचाने के लिए कोशिश करना चाहता हूँ, मैं डॉक्स तय प्राप्त करने के लिए एक बग दर्ज किया है।

बस के लिए v1.0 और 1 में जटिल चीजें।1, एक अनचाहे अपवाद का हमेशा यह मतलब नहीं था कि आपका आवेदन मर जाएगा। यदि अनचाहे अपवाद मुख्य धागे के अलावा किसी अन्य चीज पर हुआ था या थ्रेड जिसने अपने जीवन को अप्रबंधित कोड में शुरू किया था, सीएलआर ने अपवाद खा लिया और आपके ऐप को जारी रखने की इजाजत दी। यह आम तौर पर बुरा था, क्योंकि अक्सर ऐसा होता था, उदाहरण के लिए, थ्रेडपूल धागे चुपचाप मर जाएंगे, एक-एक करके, जब तक कि आपका आवेदन वास्तव में कोई काम नहीं कर रहा था। इस तरह की विफलता का कारण पता लगाना लगभग असंभव था। यही कारण है कि जेफ ने सोचा कि यह पहले काम करता है ... वह हमेशा गैर-मुख्य धागे पर दुर्घटनाओं को देखा।

v2.0 में, किसी भी थ्रेड पर एक अनचाहे अपवाद एप्लिकेशन को नीचे ले जाएगा। हमने पाया है कि ऊपर वर्णित हैंग या लापरवाही-कार्य-कार्य की समस्या को डीबग करने की तुलना में दुर्घटनाओं को डीबग करना बेहद आसान है।

बीटीडब्ल्यू, मेरी 1.1 मशीन पर एमएसडीएन से उदाहरण अपेक्षित आउटपुट है; यह सिर्फ इतना है कि जब तक आप डीबगर (या नहीं) संलग्न करते हैं, तब तक दूसरी पंक्ति दिखाई नहीं देती है। V2 में हमने चीजों को चारों ओर फिसल दिया है ताकि अनचाहे एक्सेप्शन इवेंट डीबगर अटैचमेंट से पहले आग लग जाए, जो कि ज्यादातर लोगों की अपेक्षा करता है।

जोनाथन Keljo CLR अपवाद PM जोनाथन Keljo 18 फरवरी को, 2005 10:02 PM

हालांकि, मैं अभी भी कैसे यूआई धागा आप एक पकड़ने की अनुमति की चाल सिद्ध में दिलचस्पी रखता हूँ सभी यूआई थ्रेड अपवादों के लिए सभी हैंडलर।

इससे भी अधिक, मैं बहुत ही (disabling it for the whole machine as seen here के बिना)

3

ऐसा नहीं है कि कोई ऐपडोमेन अपवाद एप्लिकेशन को समाप्त कर देता है, यह है कि अनचाहे अपवाद (किसी भी प्रकार का) ऐपडोमेन को फाड़ देगा और एप्लिकेशन को समाप्त कर देगा।

यहां मुद्दा यह है कि आप यूआई थ्रेड अपवादों को स्पष्ट रूप से उच्च स्तर पर संभाल सकते हैं। हालांकि, जब आपके पास पृष्ठभूमि थ्रेड में एक अनचाहे अपवाद होता है, तो इसे उसी स्तर पर आसानी से संभालने का कोई माध्यम नहीं होता है, इसलिए यह प्रचार करने और एप्लिकेशन को खींचने का प्रयास करता है। आवेदन। थ्रेड अपवाद आपको कम से कम यह जानने की अनुमति देता है कि यह त्रुटि के कारण होता है, और यदि आवश्यक हो तो इसे लॉग करें।

यूआई थ्रेड में अनचाहे अपवाद एक ही चीज होने का कारण बनेंगे।

+0

@Reed अपने आवेदन के लिए .NET JIT डीबगिंग संवाद निष्क्रिय करने के लिए एक तरह से इसमें रुचि है: "यूआई सूत्र में बिना क्रिया के अपवाद ही कारण होगा होने वाली बात। " - यह सच नहीं है। कृपया एक परीक्षण आवेदन बनाएं और इसे अपने लिए आज़माएं। –

+1

तकनीकी रूप से, मुझे "मुख्य धागे पर अनचाहे अपवाद" कहा जाना चाहिए था। विंडोज फॉर्म यूआई थ्रेड पर अपना अपवाद हैंडलिंग व्यवहार जोड़ता है (क्योंकि यह पूरी तरह से यूआई थ्रेड पर चल रहा है) जो मुख्य धागे के व्यवहार को बदलता है। एक कंसोल एप्लिकेशन बनाएं, और इसे आज़माएं, और आप देखेंगे कि इससे कोई फर्क नहीं पड़ता कि थ्रेड चीजें क्या होती हैं - वे सभी एप्लिकेशन को फाड़ देंगे। –

+0

फिर मुझे अपना प्रश्न बहाल करना चाहिए: UI थ्रेड कैसे इसे सामान्य अपवाद हैंडलिंग व्यवहार को पूरा करता है? क्या मैं कुछ गैर-यूआई थ्रेड के व्यवहार के रूप में दोहराना चाहता हूं? –

2

क्या यह मदद करता है?

Improved Unhandled Exception behavior in .NET 2.0

इसके अलावा, इस कोड "चुपचाप मर" लगता है। क्या आप कुछ और देख रहे हैं?

using System; 

namespace UnhandledException 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 

      throw new NotImplementedException(); 
     } 

     static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      Exception exception = (Exception)e.ExceptionObject; 
      System.Console.WriteLine("exception=[" + exception.ToString() + "]"); 

      Environment.Exit(-1); 
     } 
    } 
} 
+0

हां यह करता है .. जब आपने इसे पोस्ट किया था तो मैंने पोस्ट और टिप्पणियां पढ़ना समाप्त कर दिया था। +1 हालांकि .. –

+0

हां, Environemnt.Exit चाल करने लगता है! मैं यह देखने के लिए थोड़ी देर के लिए प्रश्न छोड़ दूंगा कि क्या कोई यूआई थ्रेड कैच-अप अपवाद को पूरा करने में अंतर्दृष्टि दे सकता है या नहीं। अन्यथा आपके पास स्वीकृत उत्तर के लिए मेरा वोट होगा! –

+0

एप्लिकेशन। थ्रेडएक्सप्शन एक "अनचाहे अपवाद हैंडलर" का एक और संस्करण है। कई प्रकार हैं (कंसोल ऐप बनाम WinForms बनाम WebForms बनाम डब्ल्यूसीएफ, आदि)। मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। आम तौर पर, मैं लागू होने वाले हर किसी को लागू करता हूं। –

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