デスクトップアプリケーションで未処理の例外が発生した場合のベストプラクティスは何ですか?
ユーザーがサポートに連絡できるように、ユーザーにメッセージを表示しようと考えていました。ユーザーにアプリケーションを再起動することをお勧めしますが、強制することはしません。ここで説明しているものと同様:ux.stackexchange.com-予期しないアプリケーションエラーを処理する最良の方法は何ですか?
プロジェクトは.NET WPFアプリケーションであるため、説明されている提案は次のようになります(これは簡略化された例です。ユーザーが[詳細の表示]をクリックして、エラーを簡単に報告してください):
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += OnDispatcherUnhandledException;
}
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
LogError(e.Exception);
MessageBoxResult result = MessageBox.Show(
$"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" +
"We recommend to restart the application. " +
"Do you want to stop the application now? (Warning: Unsaved data gets lost).",
"Unexpected error occured.", MessageBoxButton.YesNo);
// Setting 'Handled' to 'true' will prevent the application from terminating.
e.Handled = result == MessageBoxResult.No;
}
private void LogError(Exception ex)
{
// Log to a log file...
}
}
実装(ViewModelsのコマンドまたは外部イベントのイベントハンドラー)では、特定の外因性例外のみをキャッチし、他のすべての例外(ボーンヘッドおよび未知の例外)を上記の「最後のリゾートハンドラー」までバブルさせます。骨抜きと外因性の例外の定義については、次を参照してください:Eric Lippert-Vexing exceptions
アプリケーションを終了するかどうかをユーザーに決定させるのは理にかなっていますか? アプリケーションが終了すると、一貫性のない状態になります...一方、ユーザーは、保存されていないデータを失ったり、アプリケーションが再起動されるまで、開始された外部プロセスを停止できなくなります。
または、作成しているアプリケーションのタイプに応じて、未処理の例外でアプリケーションを終了する必要があるかどうかは決定されますか?コードの完全版、第2版で説明されているように、「堅牢性」と「正確性」のトレードオフにすぎませんか
私たちが話しているアプリケーションの種類を説明するために、アプリケーションは主に化学実験装置を制御し、測定結果をユーザーに表示するために使用されます。そのために、WPFアプリケーションはいくつかのサービス(ローカルおよびリモートサービス)と通信します。WPFアプリケーションは、機器と直接通信しません。