このガイドでは、.NET コンソール アプリケーション内で未処理の例外を効果的に管理する方法を説明します。 GUI や Web アプリケーションとは異なり、コンソール アプリでは、AppDomain.CurrentDomain
オブジェクトを使用する少し異なるアプローチが必要です。
次に示すように、UnhandledException
イベントにイベント ハンドラーをアタッチする一般的な方法は、コンソール アプリケーションでは失敗することがよくあります。
<code class="language-csharp">AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);</code>
これは、AppDomain
がすぐに利用できないためです。 解決策は、C# の =
演算子を使用してハンドラーを直接アタッチすることです:
<code class="language-csharp">AppDomain.CurrentDomain.UnhandledException += MyExceptionHandler;</code>
これにより、ハンドラーが正しく登録されることが保証されます。 以下は例外トラップを示す例です:
<code class="language-csharp">static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; throw new Exception("Application Error!"); } static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine(e.ExceptionObject.ToString()); Console.WriteLine("An unexpected error occurred. Press Enter to exit."); Console.ReadLine(); Environment.Exit(1); }</code>
このコードは UnhandledExceptionTrapper
メソッドを登録します。未処理の例外が発生すると、このメソッドは例外の詳細をログに記録し、アプリケーションが終了する前にユーザーがエラーを確認できるようにします。
重要な注意: このメソッドは、JIT コンパイル中にスローされた例外 (型ロード エラーやファイル ロード エラーなど) をキャッチしません。これらに対処するには、「ジッターを遅延させる」戦略を採用します。 これには、問題のある可能性のあるコードを別のメソッドに分離し、それを [MethodImpl(MethodImplOptions.NoInlining)]
属性で装飾することが含まれます。
以上が.NETコンソールアプリケーションで未処理の例外を効果的に処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。