2011-11-16 22 views
17

मैंने एक सॉफ्टवेयर लागू किया है जिसमें एक डीएलएल लाइब्रेरी है जिसमें कक्षाओं का एक विशाल समूह शामिल है जिसमें मेरे सॉफ़्टवेयर के लिए सभी विधियां शामिल हैं।WinForms ग्लोबल अपवाद हैंडलिंग?

अब मैं कुछ वैश्विक त्रुटियों को संभालने में सक्षम होना चाहता हूं जैसे त्रुटि # 26 जो प्रत्येक कक्षा में जाने और इसे जोड़ने के बजाय इन सभी वर्गों पर कोई नेटवर्क संबंधित त्रुटि नहीं है। उसको कैसे करे ?

उत्तर

12

यदि #26 एक अपवाद है तो आप AppDomain.CurrentDomain.UnhandledException ईवेंट का उपयोग कर सकते हैं। यदि यह सिर्फ एक वापसी मूल्य है, तो मुझे वैश्विक स्तर पर इसे संभालने का कोई मौका नहीं दिखता है।

try 
{ 
    Application.Run(new FormMain()); 
} 
catch (Exception ex) 
{ 
    RoboReporterConstsAndUtils.HandleException(ex); 
} 

... जहां HandleException() विधि की तरह कुछ हो सकता है:

internal static void HandleException(Exception ex) 
{ 
    var exDetail = String.Format(ExceptionFormatString, 
     ex.Message, 
     Environment.NewLine, 
     ex.Source, 
     ex.StackTrace, 
     ex.InnerException); 

    ExceptionLoggingService.Instance.LogAndEmailExceptionData(string.Format("{0}: {1}: {2}", 
     DateTime.Now.ToLongDateString(), GetVersionInfo(), exDetail)); 
} 

त्वचा के लिए एक और तरीका है

+1

कहाँ कोड के इस टुकड़े डाल करने के लिए, आप पोस्ट कर सकते हैं अगर आप किसी भी संदर्भ है या एक उदाहरण मैं बहुत महान हो जाएगा। – ykh

+0

मेरे उत्तर में एमएसडीएन लिंक देखें। इसमें एक उदाहरण है: http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx – gideon

23

चूंकि यह एक विनफॉर्म ऐप है, इसलिए आप कोशिश करें ब्लॉक में Application.Run(new MainForm()); संलग्न कर सकते हैं।

static void Main() 
{ 
try { 
Application.Run(new MainForm()); 
} catch(SystemException)//just as an example 
{ 
//log or handle the error here. 
} 
} 

मुझे इस तरह के समाधान का कोई कारण नहीं पता है, लेकिन मैंने आपको बताया कि आपको क्या चाहिए।

अन्य विकल्प Application.ThreadException ईवेंट की सदस्यता ले रहे हैं।

यहां अधिक पढ़ें: unhandledexceptions

वहाँ भी AppDomain.UnhandledException है और आप उन्हें here on MSDN के बीच अंतर को पढ़ना चाहिए।

MSDN से:

कुछ आवेदन मॉडल के लिए, UnhandledException घटना अगर बिना क्रिया का अपवाद मुख्य आवेदन धागा में होता है अन्य घटनाओं द्वारा रोका जाता जा सकता है।

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

-1

क्या ऊपर दिखाया गया है का एक विस्तार के रूप में, मैं निम्नलिखित का उपयोग यह बिल्ली है:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    AppDomain.CurrentDomain.UnhandledException += Unhandled; 
    Application.Run(new FormMain()); 
} 

static void Unhandled(object sender, UnhandledExceptionEventArgs exArgs) 
{ 
    ExceptionLoggingService.Instance.LogAndEmailMessage(String.Format 
     ("From application-wide exception handler: {0}", exArgs.ExceptionObject)); 
} 

बेशक, आप जो भी चाहते हैं वह अनचाहे() विधि के भीतर कर सकते हैं।

6
सी # विंडोज आवेदन में 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) को बुलाया जाना चाहिए।

3

सबसे पहले, आप जोड़ना चाहिए:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

उसके बाद आप अपवादों को पकड़ कर सकते हैं, उदाहरण के लिए:

[STAThread] 
    static void Main() 
    { 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
     Application.ThreadException += ApplicationThreadException; 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; 

     if (DataBaseMNG.Init()) 
     { 
      Application.Run(new MainForm()); 
     } 
    } 

    /// <summary> 
    /// Global exceptions in Non User Interfarce(other thread) antipicated error 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     var message = 
      String.Format(
       "Sorry, something went wrong.\r\n" + "{0}\r\n" + "{1}\r\n" + "please contact support.", 
       ((Exception)e.ExceptionObject).Message, ((Exception)e.ExceptionObject).StackTrace); 
     MessageBox.Show(message, @"Unexpected error"); 
    } 

    /// <summary> 
    /// Global exceptions in User Interfarce antipicated error 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) 
    { 
     var message = 
      String.Format(
       "Sorry, something went wrong.\r\n" + "{0}\r\n" + "{1}\r\n" + "please contact support.", 
       e.Exception.Message, e.Exception.StackTrace); 
     MessageBox.Show(message, @"Unexpected error"); 
    } 
संबंधित मुद्दे