4

C# Windows フォーム アプリケーションで未処理の例外をすべてキャプチャしようとしています。次のコードをProgram.csファイルに追加しましたが、例外がキャプチャされず、NullReferenceException. 私は何を間違っていますか?

static void Main()
{ 
    System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException);
    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
    var form = new MainForm();
    form.ShowDialog();
}

private static void HandleUnhandledException(Object o)
{
    // TODO: Log it!
    Exception e = o as Exception;
    if (e != null)
    {
    }
}

private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
{
    HandleUnhandledException(e.ExceptionObject);
}

private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    HandleUnhandledException(e.Exception);
}

編集:プログラムが Visual Studio の外部で実行されている場合は例外をキャッチできますが、Visual Studio からデバッグする場合は例外をキャッチできません。 ?

4

3 に答える 3

2

ハンドラーに到達する前に例外をキャッチするように見えるため、VSで例外キャッチを無効にしてみてください。

デバッグ>例外...>共通言語ランタイム例外の[ユーザー未処理]のチェックを外します。

于 2012-06-02T16:07:34.823 に答える
0

64 ビット Windows を使用している場合は、[デバッグ] -> [例外] をチェックして、CLR 例外がスローされることを確認してください。

C# でのサイレント エラー、プログラムをクラッシュさせない一見未処理の例外

于 2012-06-02T14:57:07.357 に答える
0

サブスクライブしているイベントは、例外を検査する手段を提供するだけです。例外を抑制または回復できるようにするためのものではありません。

からAppDomain.UnhandledException:

このイベントは、キャッチされていない例外を通知します。これにより、アプリケーションは、システムのデフォルト ハンドラがユーザーに例外を報告してアプリケーションを終了する前に、例外に関する情報をログに記録できます。

例外をログに記録した後で例外から回復したい場合は、コードの周りに try–catch ブロックを使用する必要があります。

于 2012-06-02T14:57:18.233 に答える