1. ホーム
  2. c#

[解決済み] WinForms アプリケーションの '未処理' 例外をすべて捕捉するものを作るにはどうしたらいいですか?

2023-03-31 10:41:17

質問

これまでは Application.Run の中に Program.cs のエントリポイントに追加します。これは、デバッグモードではすべての例外を十分に捕捉しますが、デバッグモードなしでプログラムを実行すると、例外が処理されなくなります。処理されない例外ボックスが表示されます。

私はこのようなことが起こらないようにしたいのです。非デバッグ モードで実行するときに、すべての例外が捕捉されるようにしたいのです。プログラムには複数のスレッドがあり、それらからのすべての例外が同じハンドラによって捕捉されることが望ましいです; 私はDBに例外を記録したいです。これを行う方法について、どなたかアドバイスをお持ちですか?

どのように解決するのですか?

の例を見てみましょう。 ThreadException ドキュメント :

public static void Main(string[] args)
{
   // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new     
  ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

  // Set the unhandled exception mode to force all Windows Forms errors
  // to go through our handler.
  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

  // Add the event handler for handling non-UI thread exceptions to the event. 
  AppDomain.CurrentDomain.UnhandledException += new       
  UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}

また、デバッグ時に例外をキャッチしないようにするのもよいでしょう。ややハック的ですが、そのためには上記のコードをラップして

 if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... }

デバッグ時に例外をキャッチしないようにするため。

EDIT : デバッガ内部でアプリケーションが動作しているかどうかを確認するための代替方法で、ファイル名をチェックするよりもすっきりしています。

(moltenform、Kiquenet、Dougによるコメントを参照)

if(!System.Diagnostics.Debugger.IsAttached) { ... }

とは異なるデバッガを使用した場合の問題を回避することができます。 vshost.exe .