2

アプリを終了せずに発生する可能性のある例外を条件付きで処理するために、アプリ内の未処理の例外をすべてキャッチしようとしていますが、非常に基本的な問題を解決できません。例外が停止しません。未処理の例外がコードのどこかにスローされ、ここに表示され、メッセージボックスが表示されます。その後、アプリケーションは、同じ例外が未処理である(デバッグモードの場合)か、単にクラッシュする(デバッグなしで実行する場合)ことを示します。ハンドラーが呼び出されても、例外が未処理のままであることを意味します。

App() {
    AppDomain.CurrentDomain.UnhandledException += (s, a) => {
        var ex = (Exception)a.ExceptionObject;
        MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    };
}

これは、このコードとクリックすると例外をスローするボタン以外は何も含まれていない、新しい空白のテストプロジェクトからのものです。

4

5 に答える 5

3

プログラムを終了するのを忘れています。したがって、通常の未処理の例外処理を続行します。次の行を追加します。

  Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));

少し面倒なマーシャル呼び出しにより、プロセスのProcess.ExitCodeを取得する別のプロセスが妥当なエラー表示を確実に取得します。これはオプションであり、単に推奨されます。

于 2013-02-02T19:25:04.077 に答える
0

未処理の例外を実際にキャッチしているのではなく、アプリケーションを終了する直前(リリースモード)に発生するイベントを処理しているだけです。このイベントをサブスクライブしても、すでに処理されていない例外をキャッチしたとは見なされません。

MSDNから:このイベントは、キャッチされなかった例外の通知を提供します。これにより、システムのデフォルトハンドラーがユーザーに例外を報告してアプリケーションを終了する前に、アプリケーションが例外に関する情報をログに記録できるようになります。アプリケーションの状態に関する十分な情報が利用できる場合は、後で回復するためにプログラムデータを保存するなど、他のアクションが実行される場合があります。例外が処理されない場合、プログラムデータが破損する可能性があるため、注意が必要です。

于 2013-02-02T19:03:19.647 に答える
0

例外を「停止」することは想定されていません。その動作は仕様によるものです

このイベントは、キャッチされなかった例外の通知を提供します。これにより、システムのデフォルトハンドラーがユーザーに例外を報告してアプリケーションを終了する前に、アプリケーションが例外に関する情報をログに記録できるようになります。

この場所を考えてみてください。問題の例外を処理するのに他の誰も気にかけていませんでした。ログに記録して死ぬ以外に賢明なことは何も残っていません。

発生した場所の近くでアプリケーションを終了する必要がある例外に対処する必要があります。

于 2013-02-02T18:54:01.497 に答える
0

これが本当に必要な動作である場合は、アプリケーション構成ファイルに以下を追加できます。

<legacyUnhandledExceptionPolicy enabled="1"/>

管理対象スレッドの例外を参照してください。

于 2013-02-02T18:57:30.507 に答える
0

MSDNから:

このイベントは、キャッチされなかった例外の通知を提供します。これにより、システムのデフォルトハンドラーがユーザーに例外を報告してアプリケーションを終了する前に、アプリケーションが例外に関する情報をログに記録できるようになります。アプリケーションの状態に関する十分な情報が利用できる場合は、後で回復するためにプログラムデータを保存するなど、他のアクションが実行される場合があります。例外が処理されない場合、プログラムデータが破損する可能性があるため、注意が必要です。

つまり、これは単なるハンドラーであり、何が起こったかをユーザーに通知したり、データを回復できるようにする必要がある場合は直前の保存情報を生成したり、カスタムエラーレポートを起動したりすることができます。 キャッチブロックではありません。 例外をキャッチするには、Try-Catchを使用する必要があります。

于 2013-02-02T19:02:54.990 に答える