1. ホーム
  2. c#

[解決済み】.NET コンソールアプリケーションのグローバル例外ハンドラ

2022-04-17 02:36:34

質問

質問です。コンソールアプリケーションで未処理の例外を処理するためのグローバルな例外ハンドラを定義したいのですが、どうすればよいですか?asp.netでは、global.asaxで定義でき、Windowsアプリケーション/servicesでは、以下のように定義できます。

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

しかし、コンソールアプリケーションのグローバルな例外ハンドラを定義するにはどうすればよいのでしょうか?

currentDomainは動作しないようです(.NET 2.0) ?

編集してください。

あーあ、バカなミスだ。

VB.NETでは、currentDomainの前に"AddHandler"というキーワードを追加しないと、IntelliSenseでUnhandledExceptionイベントが表示されない......ということです。

これは、VB.NETとC#のコンパイラでイベント処理の扱いが異なるからです。

解決するには?

いいえ、その方法が正しいのです。 これは、まさにそのとおりに動作しました。

using System;

class Program {
    static void Main(string[] args) {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        throw new Exception("Kaboom");
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
    }
}

この方法では、ジッターによって発生する型やファイルロードの例外をキャッチできないことに留意してください。 これらはMain()メソッドの実行が始まる前に発生します。 これらをキャッチするにはジッターを遅延させ、リスクのあるコードを別のメソッドに移動し、[MethodImpl(MethodImplOptions.NoInlining)]属性をそれに適用する必要があります。