次のようなWindowsアプリケーションまたはWindowsサービスで発生した一般的なエラーを取得するにはどうすればよいですApplication_Error
かHttpApplication
2 に答える
次のイベントを使用して、Windows フォーム アプリケーションと .Net サービスで例外をトラップできます。
AppDomain.FirstChanceException
このイベントは、イベントが後で処理された場合でも、特定の AppDomain で例外が発生するたびにトリガーされます。これはほぼ間違いなくあなたが望むものではありませんが、完全を期すために含めると思いました.
これは AppDomain ごとのイベントであることに注意してください。複数の AppDomain を使用する場合は、それぞれに対してこのイベントを処理する必要があります。AppDomain が 1 つしかない場合 (可能性が高い)、このイベントは次のように処理されます。
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
throw new NotImplementedException();
}
AppDomain.UnhandledException
このイベントは、指定された AppDomain に未処理の例外が発生するたびにトリガーされます。繰り返しますが、これは AppDomain ごとのイベントであり、イベントと同様の方法で接続されていFirstChanceException
ます。
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
これらの 2 つのイベントはいつでもフックできますが、できるだけ早くフックすることをお勧めします。そうしないと、イベント ハンドラーをフックする前に例外がスローされる可能性があります。クラス内のMain
メソッドの開始は、通常、これを行うのに適した場所です。Program
Windows フォーム アプリケーションでは、このイベントがトリガーされない可能性があることに注意してください。Windows フォーム アプリケーションの未処理の例外は (Windows フォーム インフラストラクチャによって) 異なる方法で処理され、AppDomain で未処理の例外として伝播されない場合があるためです。 .
Visual Studio でのデバッグ中にのみ Catch ブロックが実行されるのはなぜですか? をご覧ください。
Application.ThreadException
(Windows フォーム アプリケーションのみ)これは、未処理の例外が Windows フォーム アプリケーションでスローされ、Windows フォーム インフラストラクチャによってキャッチされた場合に発生します。AppDomain.UnhandledException
Windows フォーム アプリケーションで未処理の例外をキャッチする代わりに、おそらくこれを使用する必要があります。
Application.ThreadException += Application_ThreadException;
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
throw new NotImplementedException();
}
繰り返しになりますが、これをできるだけ早く接続する必要があります。通常Main
、クラス内のメソッドの開始は、これを行うのに適した場所です。Program
概要
それらのどれもASP.Net アプリケーションのメソッドとまったく同じではないことに注意してください。Application_Error
Application.ThreadException
AppDomain.UnhandledException
次のように UnhandledException イベントをサブスクライブできます。
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
コードに次のようなメソッドがあります。
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// DoSomething
}