2009-01-23 15 views
9

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

उत्तर

5

यह हमने किया है।

static void Main() { 
    try 
    { 
     SubMain(); 
    } 
    catch (Exception e) 
    { 
     HandleUnhandledException(e); 
    } 
} 

private static void SubMain() 
{ 
    // Setup unhandled exception handlers 
    AppDomain.CurrentDomain.UnhandledException += // CLR 
     new UnhandledExceptionEventHandler(OnUnhandledException); 
    Application.ThreadException += // Windows Forms 
     new System.Threading.ThreadExceptionEventHandler(
      OnGuiUnhandledException); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new frmMain()); 
} 

// CLR unhandled exception 
private static void OnUnhandledException(Object sender, 
    UnhandledExceptionEventArgs e) 
{ 
    HandleUnhandledException(e.ExceptionObject); 
} 

// Windows Forms unhandled exception 
private static void OnGuiUnhandledException(Object sender, 
    System.Threading.ThreadExceptionEventArgs e) 
{ 
    HandleUnhandledException(e.Exception); 
} 
+1

मुझे डाउनवॉट क्यों किया गया? –

+0

आप AppDomain.UnhandledException * को क्यों कार्यान्वित करते हैं और * पूरी चीज़ को Try/Catch ब्लॉक में लपेटें? वह बेवकूफ हंस है। –

1

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

हालांकि यदि आप एक वाणिज्यिक परियोजना के रूप में इस जारी कर रहे हैं, मैं, माइक्रोसॉफ्ट के साथ रजिस्टर करने के लिए इतना है कि आप वास्तव में दुर्घटना डंप और त्रुटि की रिपोर्ट करने की जानकारी है कि करने के लिए भेजा जा रहा है प्राप्त कर सकते हैं के लिए प्रोत्साहित करते एमएस

3

आपने अपना खुद का प्रश्न उत्तर दिया। त्रुटि संवाद को रोकने का सबसे अच्छा तरीका कोड लिखना है जो आपके अपवादों को संभालता है ताकि संवाद कभी प्रकट न हो। मैं दांव दूंगा कि रेमंड चेन सुझाव देगा (अगर मैं इतना बोल्ड हो सकता हूं)।

+0

एक वैश्विक प्रयास/पकड़ (पहला जवाब की तरह) मैं विचार कर रहा था। मुझे यकीन नहीं था कि यह सबसे अच्छा अभ्यास था या नहीं। मुझे यह भी यकीन नहीं था कि ऐसा करने के लिए एक क्लीनर तरीका है या नहीं। – Steve

-2

आप HKEY_LOCAL_MACHINE \ सॉफ्टवेयर \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug

के साथ खेल यही कारण है कि टिप रूप DrWatson दिनों .. या काम नहीं हो सकता है है की कोशिश कर सकते हैं।

+1

यदि आप किसी ऐप-विशिष्ट समस्या को हल करने का प्रयास कर रहे हैं, तो सिस्टम-व्यापी सेटिंग्स के साथ मक न करें –

+0

- उपयोगकर्ता इस तथ्य को पसंद नहीं कर सकते कि आप उनकी सेटिंग्स बदलते हैं ... - आपके एप्लिकेशन में इस रजिस्ट्री में लेखन पहुंच नहीं हो सकती है कुंजी। –

0

यदि आपका प्रश्न WinForms एप्लिकेशन के संबंध में था तो चयनित उत्तर आपके लिए काम करेगा, हालांकि यह बिल्कुल सुरुचिपूर्ण नहीं है।

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException 

And here's the MSDN Documentation on the method

1

आप या .NET फ्रेमवर्क 2.0 का उपयोग कर रहे बाद में और वहाँ एक कार्यकर्ता धागे से एक बिना क्रिया अपवाद नहीं है, तो मैं आपको belive:

नेट इस सटीक परिदृश्य के लिए एक सहायक प्रदान करता है भाग्य से बाहर हो गया। .NET 1.0 और 1.1 में, सीएलआर ने मुख्य थ्रेड के अलावा किसी थ्रेड से अपवाद को निगल लिया। हालांकि, यह .NET 2.0 में बदला गया था जहां थ्रेड पर एक अनचाहे अपवाद एप्लिकेशन को बंद करने का कारण बनता है।

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

जबकि मैं इसकी अनुशंसा नहीं करता हूं, एपी कॉन्फ़िगरेशन फ़ाइल में एप्लिकेशन संगतता ध्वज सेट करके सीएलआर 1.0 और 1.1 कैसे व्यवहार कर रहे थे, इस पर वापस जाने का एक तरीका है।

यह आवेदन बिना क्रिया अपवाद के मामलों में समाप्त कर देंगे और है कि त्रुटि रिपोर्ट संवाद हो रही की संभावना को कम करने के लिए कारण नहीं होना चाहिए।

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

+0

यह इस बात पर निर्भर करता है कि आप अपने कार्यकर्ता धागे को कैसे प्रबंधित करते हैं। सभी गैर-लंबे समय तक चलने वाली नौकरियों के लिए मेरा पसंदीदा दृष्टिकोण Aslegc कार्रवाई करने के लिए थ्रेडपूल थ्रेड का उपयोग करने के लिए Delegate.BeginInvoke() का उपयोग करना है। यदि आप ऐसा करते हैं तो जब आप EndInvoke() को कॉल करते हैं तो थ्रेड किसी भी अपवाद को वापस कर देगा - आपको बस यह सुनिश्चित करना होगा कि EndInvoke को प्रत्येक BeginInvoke के लिए बुलाया जाता है (ऐसा नहीं करने से संसाधनों की रिसाव हो सकती है)। – STW

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