1

例外が発生した場合にダイアログが閉じられ、アプリケーションがクラッシュしないように、ダイアログで例外を処理しようとしています。ご覧のとおり、単純な try-catch ブロックを使用しています。

IDialogView dialog = null;
try
{
    if (_dialogViewModel == null)
    {
        dialog = ViewFactory.SomeDialog();
        _dialogViewModel = new DialogViewModel(dialog);
        _dialogViewModel.LoadData();
    }
    _dialogViewModel.ShowDialog();
}
catch (Exception ex)
{
    if (dialog != null)
        dialog.Close();
    _dialogViewModel = null;
    MessageBox.Show("Sorry, there was an error in the dialog.", "Error",
                    MessageBoxButton.OK, MessageBoxImage.Error);
    return;
}

CanExecute()この問題は、ボタンのイベント ハンドラでエラーが発生した場合に発生します。エラーは正常にキャッチされましたがMessageBox、ユーザーに表示するCanExecute()と、再度実行されるため、エラーが再び発生します。最終的には、アプリケーションのクラッシュにつながります。

いくつかの情報をグーグルで検索しましたが、CanExecute()イベントハンドラーに例外がないことを確認するように言われました. しかし、このようなことは別の場所で発生する可能性があります。そのため、すべてのメソッドを操作するのではなく、ダイアログ エントリ ポイントですべての例外を単純にキャッチしたいと考えています。

だから、私の質問は次のとおりです。ダイアログを破棄して、例外がキャッチされた後に再び表示されないようにする方法は? Close()閉じる前にまだ呼び出しているため、機能しませんでしたCanExecute()

4

1 に答える 1

1

ググったときにわかったように、CanExecuteハンドラーが a) 軽量であり、b) 決して例外をスローしないことを確認する必要があります。これの主な理由に直面しています: aCanExecuteは、フレームワークによって繰り返し自動的に実行されます。フォーカスが変更されたとき、入力イベントが発生したとき、データバインディングが変更されたとき、およびほとんどまたはまったく制御できない他の多くの理由に応じて実行されます。

問題は、エラーがあり、そのエラーが繰り返し発生ていることです。つまり、クラッシュするか、ダイアログを繰り返し表示するかを選択できます。または、エラーに対して何かを行うことができます。

あなたの答え:エラーを修正してください。

(ハンドラーはそのままで他のエラーには問題ありません。そのままにしておいてください。ただし、この特定のエラーはすぐに修正する必要があります。)

于 2012-08-09T08:52:36.017 に答える