2012-07-04 7 views
9

जब कोई अपवाद किसी .NET ऐप में बेकार हो जाता है, तो वर्चुअल मशीन उपयोगकर्ता को एक त्रुटि संदेश प्रदर्शित करती है। मैं अपने ऐप के शीर्ष स्तर पर catch ब्लॉक डालने के बिना अपना स्वयं का त्रुटि संदेश प्रदर्शित करने में सक्षम होना चाहता हूं (क्योंकि यह बिना किसी अपवाद को अपर्याप्त अपवाद करता है)।मैं डिफ़ॉल्ट अपूर्ण अपवाद संवाद को ओवरराइड कैसे कर सकता हूं?

अभी मैं AppDomain.UnhandledException ईवेंट श्रोता में अपना स्वयं का त्रुटि संवाद प्रदर्शित करता हूं, लेकिन .NET- बनाया गया संवाद अभी भी दिखाई देता है। मैं Environment.FailFast से बचना चाहूंगा क्योंकि यह मेरे finally ब्लॉक (जिसे मैं अभी भी कुछ हद तक जुड़ा हुआ हूं) को बाईपास कर दूंगा।

+0

JIT की एक विशेषता है कि। मुझे यकीन नहीं है कि इसे संशोधित करने का एक तरीका है ... –

+0

मैं शायद शीर्ष स्तर पर अपना स्वयं का संवाद (और पकड़ने) को देखने और इसे देखने के बीच स्विच करने के लिए एक उत्पादन मोड/विकास मोड कॉन्फ़िगरेशन चर बनाऊंगा। डीबगिंग के लिए सामान्य रूप से यह भी एक अच्छा विचार है ... –

+1

यह निश्चित रूप से संभव है, मुझे याद आया कि लाल गेट ने इस क्षेत्र में कुछ किया है। यह [छवि] देखें (http://www.red-gate.com/products/dotnet-development/smartassembly/assets/images/error_reporting_dialog.png) और संबंधित उत्पाद [पृष्ठ] (http: //www.red- gate.com/products/dotnet-development/smartassembly/learn-more/screenshots)। मुझे यकीन नहीं है कि उनके पास एक मुफ्त संस्करण है, लेकिन उन्होंने यह किया है, इसलिए एक रास्ता होना चाहिए! – oleksii

उत्तर

5

यदि यह WinForms है, तो आपको उन सभी को पकड़ने के लिए AppDomain.UnhandledException और Application.ThreadException को संभालना होगा। कुछ अपवाद एक दूसरे को दूसरे में फ़िल्टर करते हैं।

एक समान (लेकिन सटीक नकल नहीं) प्रश्न यहाँ था कि मदद करनी चाहिए: C# - WinForms - Exception Handling for Events

+0

धन्यवाद, मुझे 'आवेदन। थ्रेड अपवाद' के बारे में पता नहीं था। – zneak

0

WP7 में समान पैटर्न के बारे में कैसे?

// Code to execute on Unhandled Exceptions 
    private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
    { 
     // do stuff 
     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      // An unhandled exception has occurred; break into the debugger 
      System.Diagnostics.Debugger.Break(); 
     } 
    } 
+0

मुझे यकीन नहीं है कि यह मुझे एक कस्टम संदेश कैसे प्रदर्शित करने देता है। – zneak

1

विण्डोज़ फॉर्म्स कि डिफ़ॉल्ट रूप से एक बिना क्रिया कामयाब अपवाद पकड़ता है जब कोई डिबगर जुड़ा हुआ है एक अंतर्निहित अपवाद संचालक है, और खिड़की संदेश प्रसंस्करण के दौरान अपवाद तब होता है, और jitDebugging = app.config में झूठी। यह अंत उपयोगकर्ता को एक संवाद दिखाता है और ऐप समाप्ति को रोकता है।

आप HKLM \ Software \ Microsoft \ .NETFramework के तहत रजिस्ट्री DbgJitDebugLaunchSetting सेटिंग बदल सकते हैं। इसमें तीन मानों में से एक है जिसमें से मुझे पता है:

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

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

(http://msdn.microsoft.com/en-us/library/2ac5yxx6(v=vs.90).aspx देखें)

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