CanExecute()出错 - 如何摆脱对话?

时间:2012-08-09 08:36:18

标签: c# wpf exception-handling canexecute

我正在尝试在对话框中处理异常,以便在发生任何异常时,对话框将关闭,应用程序不会崩溃。如您所见,我使用了一个简单的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()

1 个答案:

答案 0 :(得分:1)

正如您在google搜索时发现的那样,您应该确保CanExecute处理程序是轻量级的,并且b)永远不会抛出异常。您遇到的主要原因是:CanExecute将由框架重复运行,并自动运行。它将在焦点更改时,输入事件,数据绑定更改时运行,并响应您几乎无法控制的其他原因。

问题是:您有错误,并且重复发生错误。这意味着您可以选择崩溃或重复显示对话框。或者,您可以对错误采取一些措施。

您的回答:修复错误。

(你现在的处理程序对你的其他错误很好。把它留在那里。但是这个特殊的错误,你需要马上解决。)