C#/。NETで「プログラムが機能しなくなった」ことを避ける
-
07-07-2019 - |
質問
スクリプト(nant)から実行したいC#/。NETで記述されたコンソールアプリケーションがあります。コンソールアプリケーションで例外が発生した場合、続行したくないのですが、Windows Vistaでは、ソリューションを検索してデバッグなどを要求するポップアップがあります。
「プログラムが動作を停止しました」というポップアップを避けたいコンソールアプリケーションで例外が発生したとき。これをC#/。NETから制御するにはどうすればよいですか?
(同様の質問が C言語の問題に対処しています、しかし、C#/。NETのソリューションが欲しいです。)
(明確にするために、例外をnantに渡したいが、ポップアップをなししたい。)
解決
未処理の例外がある場合、JITデバッガーのポップアップが表示されます。つまり、例外はランタイム内のすべてのスレッドのルートまでスタックをトンネルします。
これを回避するには、 AppDomain.CurrentDomain.UnhandledException
イベントを呼び出し、単に Environment.Exit(1)
を使用して正常に終了します。
これにより、AppDomain内のすべてのスレッドですべての例外が処理されます。特別なことをしていない限り、アプリにはおそらくAppDomainが1つしかないので、これを public static void Main
メソッドに入れるだけで十分です:
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject);
Environment.Exit(1);
};
おそらく、この場合もNAntロガーを使用してエラーを書き出す必要があります(ただし、このオフハンドのAPIを思い出せません。)
JITデバッグを無効にするマシン上。これは、専用のビルドサーバーなどの特定の状況でのみお勧めします。
他のヒント
例外をキャッチし、ログ/無視するだけです。
未処理の例外のため、ポップアップが表示されます。それを避けるには、メインメソッドがすべての例外をキャプチャし、それらを他の有用な情報に変換してください。例外を無視することはお勧めしません。
ところで、例外はスレッドごとであることを思い出してください。したがって、アプリケーションがスレッドを生成するか、スレッドプールスレッドを使用する場合は、これらのハンドラも必要です。
Windows Vistaでは、プログラムに対してこのダイアログを無効にできます。
「問題レポートとソリューション機能」を無効にします。 [コントロールパネル]-> [問題報告とソリューション]-> [設定の変更]-> [詳細設定]-> [プログラムの無効化、問題の報告]
通常、これはアプリが例外を処理しない場合にのみ発生します。コンソールアプリ全体をtry / catchブロックでラップし、失敗コードを返すだけの場合、これを回避できます。