2008-08-04 12 views
22

में अनचाहे अपवाद हैंडलर मैं .NET 1.1 एप्लिकेशन को बनाए रख रहा हूं और जिन चीज़ों के साथ मैंने काम किया है उनमें से एक यह सुनिश्चित कर रहा है कि उपयोगकर्ता को कोई असभ्य त्रुटि अधिसूचनाएं दिखाई न दें।.NET 1.1

मैंने Application.ThreadException और AppDomain.CurrentDomain.UnhandledException पर हैंडलर जोड़े हैं, जिन्हें कॉल किया जाता है। मेरी समस्या यह है कि मानक सीएलआर त्रुटि संवाद अभी भी प्रदर्शित होता है (अपवाद हैंडलर कहा जाता है)।

जेफ इस ब्लॉग के बारे में अपने ब्लॉग here और here पर इस समस्या के बारे में बात करता है। लेकिन कोई समाधान नहीं है। तो बेजोड़ अपवादों को संभालने और एक दोस्ताना संवाद बॉक्स प्रदर्शित करने के लिए .NET 1.1 में मानक तरीका क्या है?

जेफ की प्रतिक्रिया सही उत्तर के रूप में चिह्नित की गई थी, क्योंकि उनके द्वारा प्रदान किए गए लिंक में सबसे आवश्यक जानकारी है कि क्या आवश्यक है।

उत्तर

11

ओह, विंडोज़ फॉर्म में आप निश्चित रूप से इसे काम करने में सक्षम होना चाहिए। एकमात्र चीज़ जो आपको देखना है वह अलग-अलग धागे पर हो रही है।

मैं जो मदद करनी चाहिए यहां पुराने कोड परियोजना लेख है:

User Friendly Exception Handling

3

क्या यह एक कंसोल एप्लिकेशन या विंडोज फॉर्म एप्लिकेशन है? मेरी 1.1 मशीन पर

Btw, MSDN से उदाहरण की उम्मीद उत्पादन करता है,: - यदि यह एक .NET 1.1 सांत्वना आवेदन यह है, दुर्भाग्य से, डिजाइन से है यह second blog post you referenced में एक MSFT देव द्वारा की पुष्टि की है यह सिर्फ इतना है कि जब तक आप डीबगर (या नहीं) संलग्न करते हैं, तब तक दूसरी पंक्ति दिखाई नहीं देती है। V2 में हमने चीजों को चारों ओर फिसल दिया है ताकि अनचाहे एक्सेप्शन इवेंट डीबगर अटैचमेंट से पहले आग लग जाए, जो कि ज्यादातर लोगों की अपेक्षा करता है।

ऐसा लगता है जैसे .NET 2.0 यह बेहतर करता है (भलाई का शुक्र है), लेकिन ईमानदारी से, मेरे पास वापस जाने और जांचने का समय कभी नहीं था।

1

यह एक विंडोज़ फॉर्म एप्लिकेशन है। एप्लिकेशन द्वारा पकड़े गए अपवाद। थ्रेडएक्सप्शन ठीक काम करते हैं, और मुझे बदसूरत .NET अपवाद बॉक्स (ठीक को समाप्त करने के लिए को डीबग करने के लिए रद्द नहीं किया गया है? इसके साथ कौन आया ??)।

मुझे कुछ अपवाद मिल रहे थे जो उस पर पकड़े नहीं जा रहे थे और AppDomain पर जा रहे थे। अनचाहे अपवाद घटना जो समस्याएं पैदा कर रही थी। मुझे लगता है कि मैंने उन अधिकांश अपवादों को पकड़ा है, और मैं उन्हें अब हमारे अच्छे त्रुटि बॉक्स में प्रदर्शित कर रहा हूं।

तो मुझे उम्मीद है कि कुछ अन्य परिस्थितियां नहीं हैं जो अपवादों को एप्लिकेशन द्वारा पकड़ा नहीं जा सकता है। थ्रेडएक्सप्शन हैंडलर।

4

AppDomain.UnhandledException एक घटना, नहीं एक वैश्विक अपवाद संचालक है। इसका मतलब यह है कि, जब तक इसे उठाया जाता है, तब तक आपका आवेदन नाली के नीचे जा रहा है, और क्लीनअप और त्रुटि लॉगिंग करने के अलावा, आप इसके बारे में कुछ भी नहीं कर सकते हैं।

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

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

संपादित करें: विंडोज़ में निर्मित त्रुटि-रिपोर्टिंग तंत्र को अक्षम करना (= हैक) करना संभव है, इसलिए जब आपका ऐप डाउन हो जाए तो अनिवार्य "क्रैश एंड बर्न" संवाद प्रदर्शित नहीं होता है। हालांकि, यह सभी के लिए सिस्टम में अनुप्रयोगों के लिए प्रभावी हो जाता है, न केवल स्वयं।

5

क्रिया के अपवाद व्यवहार एक .NET 1.x में Windows फॉर्म्स आवेदन पर निर्भर करता है:

  • धागे के प्रकार है कि अपवाद
  • फेंक दिया एक डिबगर चाहे वह खिड़की संदेश प्रसंस्करण
  • के दौरान हुई हैं प्रक्रिया से जुड़ा था
  • DbgJitDebugLaunchSetting रजिस्ट्री
  • app.config
  • में jitDebugging ध्वज की स्थापना 210
  • चाहे आप overrode विंडोज फॉर्म्स अपवाद संचालक
  • आप CLR के अपवाद घटना संभाला चाहे
  • चांद के चरण

बिना क्रिया अपवाद के डिफ़ॉल्ट व्यवहार है:

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

एक बिना क्रिया का अपवाद के लिए संपर्क का बिंदु हैं:

  • विंडोज फॉर्म्स अपवाद संचालक।
  • जेआईटी-डीबग रजिस्ट्री स्विच DbgJitDebugLaunchSetting।
  • सीएलआर अनचाहे अपवाद घटना।
    • अपवाद मुख्य थ्रेड पर है और कोई डिबगर संलग्न:

    विंडोज फार्म में निर्मित अपवाद हैंडलिंग डिफ़ॉल्ट रूप से निम्नलिखित है: जब

    • कैच एक बिना क्रिया का अपवाद।
    • विंडो संदेश प्रसंस्करण के दौरान अपवाद होता है।
    • jitDebugging = App.Config में झूठी।
  • उपयोगकर्ता को संवाद दिखाता है और ऐप समाप्ति को रोकता है।

आप ऐप.कॉन्फिग में jitDebugging = true सेट करके बाद के व्यवहार को अक्षम कर सकते हैं। लेकिन याद रखें कि यह ऐप समाप्ति रोकने का आपका आखिरी मौका हो सकता है। तो एक बिना क्रिया का अपवाद को पकड़ने के लिए अगले कदम, उदा, रजिस्ट्री HKEY_LOCAL_MACHINE \ Software.NetFramework तहत DbgJitDebugLaunchSetting की स्थापना घटना Application.ThreadException के लिए पंजीकरण किया जाता है, .:

Application.ThreadException += new 
Threading.ThreadExceptionHandler(CatchFormsExceptions); 

नोट। इसमें तीन मानों में से एक है जिसमें से मुझे पता है:

  • 0: उपयोगकर्ता संवाद "डीबग या टर्मिनेट" पूछता है।
  • 1: सीएलआर के साथ निपटने के लिए अपवाद देता है।
  • 2: DbgManagedDebugger रजिस्ट्री कुंजी में निर्दिष्ट डीबगर लॉन्च करता है।

दृश्य स्टूडियो में, मेनू करने के लिए 0 या 2. के लिए इस कुंजी सेट करने के लिए उपकरणविकल्पडिबगिंगJIT जाना लेकिन 1 का मान एक अंतिम-उपयोगकर्ता के पर आमतौर पर सबसे अच्छा है मशीन। ध्यान दें कि सीएलआर अनचाहे अपवाद घटना से पहले इस रजिस्ट्री कुंजी पर कार्य किया जाता है।

यह अंतिम घटना एक अनचाहे अपवाद लॉग करने का आपका आखिरी मौका है। आपके आखिरकार ब्लॉक निष्पादित होने से पहले यह ट्रिगर हो गया है। आप इस घटना को निम्नानुसार रोक सकते हैं:

AppDomain.CurrentDomain.UnhandledException += new 
System.UnhandledExceptionEventHandler(CatchClrExceptions); 
संबंधित मुद्दे