2012-06-11 13 views
5

AppDomain.CurrentDomain.UnhandledException पर घटनाओं की सदस्यता लेने पर UnhandledExceptionEventArgsIsTerminating ध्वज सही होने के कारण क्या मानदंडों का कारण बनता है? अर्थात। क्या अपवाद को घातक माना जाता है?UnhandledExceptionEventArgs.IsTerminating ध्वज सही या गलत होने का कारण क्या है?

क्या यह मामला है कि डिफ़ॉल्ट रूप से सभी अनचाहे अपवाद तब तक घातक होंगे जब तक अन्यथा कॉन्फ़िगर नहीं किया जाता?

उत्तर

7

यह संपत्ति हमेशा सच है। यह झूठी होने के लिए संभव था, .NET 1.x दिनों में वापस। उस संस्करण ने थ्रेड को एक अनचाहे अपवाद पर मरने की इजाजत दी, जिसके बिना पूरी प्रक्रिया समाप्त हो गई। यह अभी अच्छी तरह से काम नहीं कर रहा है, प्रोग्रामर ने इवेंट हैंडलर को लागू नहीं किया है (या यह नहीं पता था कि घटना से अपवाद को सही ढंग से कैसे संभालना है), तो थ्रेड बस बिना किसी सूचना के मर गए। प्रोग्राम विफलता का निदान करने के लिए इस कारण को असंभव नहीं करना लगभग असंभव है।

माइक्रोसॉफ्ट ने .NET 2.0 में डिफ़ॉल्ट व्यवहार बदल दिया, एक अनचाहे अपवाद प्रोग्राम को समाप्त करता है। तकनीकी रूप से इस व्यवहार को ओवरराइड करना अभी भी संभव है, एक कस्टम सीएलआर होस्ट IHostPolicyManager इंटरफ़ेस को कार्यान्वित करके प्रक्रिया को जीवंत रख सकता है। और डिफ़ॉल्ट होस्ट <legacyUnhandledExceptionPolicy> कॉन्फ़िगरेशन तत्व का समर्थन करता है। इसका उपयोग न करें, इस तरह ड्रेगन झूठ बोलते हैं।

+0

बस कोशिश करके, मैं देख सकता हूं कि एक ही अनचाहे अपवाद (उदाहरण: अमान्यडेटा एक्सेप्शन) में एप्लिकेशन में निष्पादित होने पर सत्य को सेट करना सही है, लेकिन यूनिट परीक्षण (vstest.executionengine) में समान कोड निष्पादित होने पर यह गलत पर सेट होता है। वीएस2017 का बहिष्कार)। –

3

नहीं, किसी अन्य एप्लिकेशन द्वारा बनाए गए प्रबंधित धागे से अनचाहे अपवादों में गलत के बराबर IsTerminating होगा, क्योंकि यह थ्रेड को मार देगा लेकिन समग्र एप्लिकेशन नहीं। यही वह समय है जिसे मैंने कभी देखा है इस स्थिति में झूठ बोलना गलत है, और MSDN page कहता है कि यह मुख्य उपयोग-मामला भी है।

0

मैंने परीक्षण उद्देश्यों के लिए इसका उपयोग किया। मैं अपने UnhandledExceptionHandler का परीक्षण करना चाहता था जो अपवादों को लॉग करता है। इसलिए मैंने इसे सेट किया ताकि मैं संदेश लॉग कर सकूं लेकिन परीक्षण थ्रेड को शूट न करूं।

लेकिन आम तौर पर, इसका मतलब यह है कि मैंने देखा है कि अन्य सभी स्थितियों में, IsTerminating ध्वज सत्य पर सेट किया गया था।