2

私は、プレーンを使用して実装されているプロジェクトに取り組んでいthreadsます。アプリケーションで予想される例外のほとんどは処理されますが、スレッドの 1 つが予期しない例外をスローし、アプリケーションがクラッシュする場合があります (アプリケーションは両方I/OClient-Server基づいているため、すべての例外を処理することは事実上不可能です)。

UnhandledExceptionHandlerこれを修正するために、アプリケーションがクラッシュするのではなくわかりやすいメッセージを表示するように、グローバルを定義しようとしています。これは私が試したものです:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.UnhandledException +=
            new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        // The rest of the startup logic goes here
    }

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Utilities.DisplayUnhandledException((Exception)e.ExceptionObject);
    }
}

しかし、これはうまくいきません。はCurrentDomain_UnhandledException呼び出されません。残念ながら、アプリケーションの構造を変更することはできません。つまり、Task Parallel Library を使用することはできません。なぜこれが機能しないのかわかりません。スレッドでスローされた例外を処理する他の方法はありますか? どんな助けでも大歓迎です。

4

1 に答える 1

4

あなたのアプローチは正しいです。ただし、アプリケーションの終了を止めることはできません。

アプリケーションで作成したスレッドで未処理の例外がスローさCurrentDomain_UnhandledExceptionれると、 が呼び出され、例外を記録または報告できます。ただし、そうでない限り、アプリケーションの終了を止めることe.IsTerminatingfalseできません。この動作の詳細については、マネージ スレッドの例外を参照してください。

が呼び出されていないことがわかった場合は、ハンドラーをセットアップするために が呼び出されてCurrentDomain_UnhandledExceptionいることを確認する必要があります。Application_Startup

Utilities.DisplayUnhandledExceptionそれでも問題が解決しない場合は、例外がスローされないことを確認する必要があります。これにより、アプリケーションの即時終了も発生します。特に、e.ExceptionObjectが型にExceptionキャストされていない場合はException、例外がスローされます。ただし、通常の状況では、例外オブジェクトがマネージ例外でない場合RuntimeWrappedException .

アプリケーションの終了を回避するには、スレッド メソッドの「スタックの一番上」で例外をキャッチする必要があります。コードにアクセスできないためにそれが不可能な場合、未処理の例外はソフトウェアにバグがあることを示しています。ソフトウェアのバグが発見されたときに行う最善の方法は、不便ではありますが、破損を避けるためにアプリケーションを終了することです。 .

于 2013-06-20T00:34:46.120 に答える