6

私は現在、Application.ThreadExceptionイベントをリッスンしてGUIスレッドで未処理の例外をトラップするWinFormsアプリケーションを保守しています。

今では最近まで期待通りに動いています。しかし最近、このイベントは一部のプロダクションボックスで適切に発生しなくなりました。アプリはハンドラーをスキップし、GUIスレッドで未処理の例外が発生するとクラッシュします。不思議なことに、これを(新しい)開発ボックスで再現することはできますが、実際にイベントが正しく発生しているマシンがいくつかあります。

次のようにポリシーを明示的に設定することで、動作を一貫させることができます。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

しかし、何がデフォルトのポリシーを制御しているのか知りたいです。MSDNは「アプリケーション構成ファイル」を漠然とほのめかしていますが、app.configや私が知っている他の構成ファイルにはそのようなポリシー設定はありません。

この一貫性のない動作の原因は何ですか?

4

2 に答える 2

1

私が考えることができるのは1つだけです。例外処理ロジックは、デバッガーが接続されているかどうかを認識します。これは、デフォルトのUnhandledExceptionMode.Automaticが有効になっている場合に重要です。デバッガーが接続されている場合、Winformsメッセージループは例外をキャッチしようとしません。これはかなり重要ですが、例外のデバッグがかなり難しくなります。デバッガーは、例外が処理されていない場合にのみステップインして、例外アシスタントを表示します。

UnhandledExceptionMode.CatchExceptionを使用しても問題ありません。これにより、例外処理の一貫性が保たれます。つまり、開発マシンでは、クライアントのマシンとまったく同じように動作します。ただし、コードのトラブルシューティングを行うには、[デバッグ+例外、スローボックス]が必要になります。これにより、例外がスローされた場合、キャッチされているかどうかに関係なく、デバッガーは常に停止します。

于 2011-09-04T12:59:26.857 に答える
0

私もこれを経験し始めました。テスターが認識していて、自分のマシンで再現できない例外をデバッグしようとしていました。VSとビオラで例外停止動作をオンにしましたが、実際には例外が発生していました。ただし、続行するためにF11に移動した場合、例外は黙って無視されていることがわかります。

私は2台のマシンを持っています。1台のマシンはWin764ビットであり、VS2008とVS2010がインストールされているため、.Net4.0がインストールされています。テストしているアプリケーションは.Net3.5であり、VS2008でデバッグされています。

もう1つのマシンは、Win XP 32ビット、プレーンジェーンVS 2008、および.Net3.5です。

Win7マシンは黙って無視します。XPマシンは大声で文句を言います。.Net 4.0をインストールすると、デフォルトのポリシーが変更されたと思います。

私は電話することによってそれを回避しました

Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );
于 2012-01-03T19:17:48.337 に答える