我正在尝试在对话框中处理异常,以便在发生任何异常时,对话框将关闭,应用程序不会崩溃。如您所见,我使用了一个简单的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()
。
答案 0 :(得分:1)
正如您在google搜索时发现的那样,您应该确保CanExecute
处理程序是轻量级的,并且b)永远不会抛出异常。您遇到的主要原因是:CanExecute
将由框架重复运行,并自动运行。它将在焦点更改时,输入事件,数据绑定更改时运行,并响应您几乎无法控制的其他原因。
问题是:您做有错误,并且重复发生错误。这意味着您可以选择崩溃或重复显示对话框。或者,您可以对错误采取一些措施。
您的回答:修复错误。
(你现在的处理程序对你的其他错误很好。把它留在那里。但是这个特殊的错误,你需要马上解决。)