2017-01-11 4 views
2

内のすべてのスレッドの例外を処理、私はテストコードを以下しているWinformsの

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; 
    } 

そして、私のメインのコードは、この

[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"); 
    } 

のようなものであるとしても、私は、アプリケーションがスレッド例外でクラッシュし、両方の例外を扱っています。

スレッドの例外を処理するために必要な修正があるかどうか。

+0

多分* "Windowsフォームが作成し所有していないスレッドで発生する例外をキャッチするには、UnhandledExceptionイベントハンドラを使用してください。" * https://msdn.microsoft.com/en-us/library/system.windows.forms .application.threadexception(v = vs.110).aspx –

答えて

1

処理されていないCurrentDomain例外を処理することはできませんし、プログラムを処理した後もプログラムを続行することはできません。

UnhandledExceptionイベントが発生するまでに、UIスレッドのスタックは、プログラムを続行するにはあまりにも遠すぎます。

AppDomain.UnhandledException状態のドキュメントとして:システム・デフォルト・ハンドラは、ユーザーに例外を報告し、アプリケーションを終了する前

それはアプリケーションが例外に関する情報を記録することができます。

あなたがイベント通知を受信したとき、あなたがe.IsTerminatingの値を検査した場合、あなたはそれがtrueだことがわかります。

唯一の手段は、ボタンハンドラ内の例外を処理することです。

ThreadExceptionが捕捉された後にプログラムを続ける理由は、そのスレッドのスタックだけが巻き戻されているため、UIスレッドに(直接的な)影響を与えないことに注意してください。

関連する問題