3

関数やオブジェクトで例外をスローする可能性のあるプロジェクトがありますが、フレームワーク/プログラム全体ですべての例外をキャッチして、後で表示できるようにログに記録できるようにする方法はありますか?コールスタックと例外メッセージが必要です。例外がどこにスローされるかは必ずしもわかりませんが、プログラムの存続期間中に発生した例外をログに記録したいと思います。とにかくこれを行うことはありますか?考えられる例外スロー関数を試してキャッチしたくありません。未処理の例外が原因でプログラムが中断しますが、最初にログに記録したいと思います。

4

6 に答える 6

3

はい、それを行う方法があります。メインに次の行を記述します。

// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(MainForm_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);

例外を処理するよりも

private static void MainForm_UIThreadException(object sender, ThreadExceptionEventArgs t)
{
    //do something
}

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //do something
}
于 2013-03-05T23:17:09.953 に答える
1

例外をキャッチするための重要なポイントは、スローされた例外の種類に基づいて適切に処理することです。大きな例外ハンドラが 1 つあると、個々の例外を処理できず、例外を飲み込んでしまう可能性があります。しかし、だからといって、すべての場合にそれができない、またはすべきではないというわけではありません。

プロジェクトに 1 つの大きなハンドラーが必要な場合は、 AppDomain.UnhandledExceptionイベントを簡単に処理できます。他の場所で例外をキャッチしている場合でも、このメソッドを処理することは、例外を見逃したときにプログラムが不親切なエラーをスローしないようにするための良い考えです。これは、WinForm.

も使用しているWCFため、IErrorHandlerインターフェイスを調べて、障害メッセージの処理に役立てることができます。

于 2013-03-05T23:19:30.103 に答える
1

後で見ることができるようにログに記録できるように、フレームワーク/プログラム全体ですべての例外をキャッチする方法はありますか?

すべてのアプリケーション タイプで未処理の例外をすべてAppDomain.CurrentDomain.UnhandledExceptionキャッチする唯一の方法は、前述の を使用することです。ただし、そのイベントを使用してアプリケーションが終了するのを防ぐことはできません (そうすることができますが、ハックっぽいので方法は説明しません)。

ただし、ほとんどのフレームワークには未処理の例外をキャッチする方法があり、例外をロックして先に進むことができます。WCFについて言及したので、 IErrorHandlerについて読みたいと思うかもしれません

私は、可能な例外スロー関数を試してキャッチしたくありません。

それが私のやり方です。その例外をキャッチしないでください。;)

于 2013-03-07T12:33:01.247 に答える
0

後で見ることができるようにログに記録できるように、フレームワーク/プログラム全体ですべての例外をキャッチする方法はありますか?

はい、未処理の例外を処理するためのデスクトップ アプリケーションまたは Web アプリケーション用のハンドラーがあります。デスクトップ アプリでは、このイベントは UnhandledException と呼ばれます。Web アプリケーションでは、アプリケーション エントリ ポイント (通常は Global.asax.cs) の Application_Error です。

私は、可能な例外スロー関数を試してキャッチしたくありません。ハンドルされない例外のためにプログラムが壊れますが、最初にログに記録したいと思います。

例外をキャッチしたくない場合は、いつでも単純に再スローできます。プログラムをクラッシュさせるために泡立ち続けます。

catch(Exception ex)
{
    //logging here
    throw;//rethrow
}

コール スタックと例外メッセージが必要です。

Exceptionクラスにはこれらが含まれています。イベントハンドラーの場合、アプリケーションの種類によってさまざまなアクセス方法があります。

于 2013-03-05T23:30:55.500 に答える
0

いつでもAppDomain.UnhandledExceptionを使用できます

static void Main()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException);
}

private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args) {
    Logger.Log((Exception)args.ExceptionObject);
}
于 2013-03-05T23:18:01.963 に答える
0

アプリ ドメイン レベルで例外をキャッチできます -アプリ ドメイン例外

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

リンクを読むと、ThreadException などの他のイベントによってアプリ ドメインが起動しない可能性があることが言及されているため、複数のハンドラーが必要になる場合があります。

Application.ThreadException += new ThreadExceptionEventHandler (ThreadExceptionHandler);

また、次の点にも注意してください: (winforms - SetUnhandledExceptionModeに関連して)

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
于 2013-03-05T23:17:36.113 に答える