सी # विंडोज आवेदन में
Centralized Exception Handling के संदर्भ के साथ
, मैं अच्छा समाधान में से एक पाया:
static class Program
{
[STAThread]
static void Main()
{
// Add handler to handle the exception raised by main threads
Application.ThreadException +=
new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
// Add handler to handle the exception raised by additional threads
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// Stop the application and all the threads in suspended state.
Environment.Exit(-1);
}
static void Application_ThreadException
(object sender, System.Threading.ThreadExceptionEventArgs e)
{// All exceptions thrown by the main thread are handled over this method
ShowExceptionDetails(e.Exception);
}
static void CurrentDomain_UnhandledException
(object sender, UnhandledExceptionEventArgs e)
{// All exceptions thrown by additional threads are handled in this method
ShowExceptionDetails(e.ExceptionObject as Exception);
// Suspend the current thread for now to stop the exception from throwing.
Thread.CurrentThread.Suspend();
}
static void ShowExceptionDetails(Exception Ex)
{
// Do logging of exception details
MessageBox.Show(Ex.Message, Ex.TargetSite.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
ऊपर वर्ग में, हम दो घटनाओं के लिए एक ईवेंट हैंडलर देते हैं जाएगा। जैसे ही मुख्य विधि शुरू होती है, इन घटनाओं को संलग्न करना बेहतर होता है।
आवेदन। थ्रेड अपवाद - मुख्य घटना में अपवाद डालने पर यह ईवेंट उठाया जाएगा। यदि हम एक ईवेंट हैंडलर जोड़ते हैं, तो अपवाद विधि पर संभाला जाता है।
AppDomain.CurrentDomain.UnhandledException - यह घटना तब उठाई जाएगी जब एप्लिकेशन में उपयोग किए गए अतिरिक्त थ्रेड में अपवाद डाला जाएगा। यहां पर और भी खराब परिदृश्य है जैसे ही हैंडलर का निष्पादन खत्म हो जाता है, अपवाद फिर से फेंक दिया जाता है जबकि एप्लिकेशन समाप्त होता है। इसे संभालने की जरूरत है। यहां मैंने इस स्थिति को संभालने के लिए थोड़ा सा कोड इस्तेमाल किया है और बिना किसी रुकावट के आवेदन को निष्पादित करना जारी रखा है।
इस स्थिति को दूर करने के लिए मैंने जो तर्क प्रयोग किया है, वह सिर्फ ईवेंट हैंडलर में थ्रेड को निलंबित कर रहा है, ताकि एप्लिकेशन ठीक काम कर रहा हो। फिर इस धागे को निलंबित करने में एक समस्या उत्पन्न होती है। जब मुख्य रूप बंद हो जाता है, तो एप्लिकेशन को सामान्य रूप से बाहर निकलने की आवश्यकता होती है, लेकिन चूंकि निलंबित स्थिति में है, तो एप्लिकेशन अभी भी चल रहा है। तो आवेदन को पूरी तरह से बाहर निकलने और प्रक्रिया को रोकने के लिए, मुख्य विधि के अंत से पहले पर्यावरण। एक्सिट (-1) को बुलाया जाना चाहिए।
स्रोत
2017-03-23 06:15:56
कहाँ कोड के इस टुकड़े डाल करने के लिए, आप पोस्ट कर सकते हैं अगर आप किसी भी संदर्भ है या एक उदाहरण मैं बहुत महान हो जाएगा। – ykh
मेरे उत्तर में एमएसडीएन लिंक देखें। इसमें एक उदाहरण है: http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx – gideon