2009-09-14 8 views
28

私は、スクリプト(nant)から実行したいC#/ .NETで書かれたコンソールアプリケーションを持っています。コンソールアプリケーションで例外が発生した場合、私はナントを続行したいが、Windows Vistaには解決策を探してデバッグなどを尋ねるポップアップがある。C#/。NETで "program stopped working"を避ける

"プログラムが動作しなくなったコンソールアプリケーションで例外が発生したときに発生します。これをC#/ .NETからどうやってコントロールできますか?

(。。同様の質問がthe issue for the C languageに対処し、私はC#の/のためのソリューションをご希望のNET)

(明確にする:私は例外がNAntのに渡すことが好きですが、なしポップアップでしょう。 )

答えて

40

JITデバッガーのポップアップは、未処理の例外がある場合に発生します。つまり、例外は実行時にスタックのすべてのスレッドのルートにトンネルされます。

これを回避するには、AppDomain.CurrentDomain.UnhandledExceptionイベントを処理して、Environment.Exit(1)と正常に終了するように呼び出してください。

これは、AppDomain内のすべてのスレッドですべての例外を処理します。 (

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
{ 
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject); 
    Environment.Exit(1); 
}; 

おそらく、この場合にもエラーを書き出すためにNAntのロガーを使用する必要があります:あなたは特別な何かをやっている場合を除き、あなたのアプリケーションは、おそらく唯一ので、あなたのpublic static void Main方法でこれを置くことが十分である、1つのAppDomainを持っていますしかし、これをオフショア用に呼び出すことはできません。)

また、マシン上でdisable JIT debuggingにすることもできます。私は専用のビルドサーバーなどの特定の状況でのみこれをお勧めします。

+1

これはデバッグをやめる前にリリースモードになっているかどうか尋ねてください。 – Andreas

+0

なぜ 'args.ExceptionObject'が'例外 'ではないのですか?キャストするのは安全ですか? – Winter

+0

@Winter良い質問です。私は 'as'キャストを使用し、' null'を自分自身でチェックします。 –

1

例外をキャッチし、ログ/無視してください。

+0

はい、ポップアップを回避しますが、このプログラムを呼び出す他のプログラムを使用すると、何らかの例外が発生したことがわかります。受け入れられた答えを見てください。 –

+0

catchブロックでEnvironment.Exitを呼び出すことができます。 – maciejkow

0

通常、アプリが例外を処理しない場合にのみ発生します。 try/catch bblockでコンソールアプリケーション全体をラップし、失敗コードを渡すだけなら、これを避けることができます。

1

未処理の例外が原因でポップアップが表示されます。これを避けるには、メインメソッドがすべての例外をキャプチャし、他の有用な情報に変換してください。例外を無視するだけではお勧めできません。

Btwはスレッドごとに例外があることに注意してください。アプリケーションがスレッドを生成したりスレッドプールスレッドを使用している場合は、これらのハンドラも必要です。

1

Windows Vistaでは、プログラムに対してこのダイアログを無効にすることができます。

「問題報告と解決機能」を無効にします。コントロールパネル - >問題のレポートと解決策 - >設定の変更 - >詳細設定 - >プログラム、問題の報告をオフにする

+0

はい、それは自分のマシンに設定しても構いませんが、他のマシンでも一貫して動作するようにプログラムに焼きたいと思っています。 (受け入れられた答えを参照してください) –

+1

私はWindows 10でこれを行うことができますか? – zsf222

関連する問題