2017-01-11 2 views
2

I Test-Code,Behandeln Sie alle Gewinde Ausnahme in WinForms

verfolgt haben
private void button3_Click(object sender, EventArgs e) 
    { 
     Thread obj = new Thread(exception); 
     obj.Start(); 
    } 
    void exception() 
    { 
     try 
     { 
      int i = 0; 
      int k = i/i; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     int i = 0; 
     int k = i/i; 
    } 

Und mein Hauptcode ist wie dieser

[STAThread] 
    static void Main() 
    { 
     Application.ThreadException += Form1_UIThreadException; 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs e) 
    { 
     MessageBox.Show("Exception"); 
    } 

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     // MessageBox.Show("Exception UI"); 
    } 

Auch habe ich behandelt sowohl die Ausnahmen Anwendung auf Thread Ausnahme abstürzt.

Ob eine Korrektur muss ich auch für Handle Thread Ausnahme tun?

+0

Möglicherweise * "Verwenden Sie den UnhandledException-Ereignishandler, um Ausnahmen einzufangen, die in Threads auftreten, die nicht von Windows Forms erstellt und gehört werden." * Https://msdn.microsoft.com/en-us/library/system.windows.forms .application.threadexception (v = vs.110) .aspx –

Antwort

1

Sie können eine nicht behandelte CurrentDomain-Ausnahme nicht verarbeiten und das Programm fortsetzen, nachdem Sie es verarbeitet haben.

Wenn das Ereignis UnhandledException ausgelöst wird, wurde der Stapel des UI-Threads bereits zu weit abgewickelt, damit das Programm fortgesetzt werden kann.

Als Dokumentation für AppDomain.UnhandledException Zustände:

Es ist die Anwendung Informationen über die Ausnahme, bevor das System Standard-Handler protokollieren können, berichtet die Ausnahme für den Benutzer und die Anwendung beendet.

Wenn Sie den Wert von e.IsTerminating überprüfen, wenn Sie die Ereignisbenachrichtigung erhalten haben, werden Sie sehen, dass es true ist.

Sie können nur Ausnahmen im Button-Handler behandeln.

Beachten Sie, dass der Grund dafür, dass das Programm fortgesetzt werden kann, nachdem ThreadException abgefangen wurde, dass nur der Stapel dieses Threads abgewickelt wurde, was sich nicht direkt auf den UI-Thread auswirkt.

Verwandte Themen