Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CanExecute()中出错-如何摆脱对话框?_C#_Wpf_Exception Handling_Canexecute - Fatal编程技术网

C# CanExecute()中出错-如何摆脱对话框?

C# CanExecute()中出错-如何摆脱对话框?,c#,wpf,exception-handling,canexecute,C#,Wpf,Exception Handling,Canexecute,我试图在对话框中处理异常,以便在出现异常时关闭对话框,应用程序不会崩溃。如您所见,我使用了一个简单的try-catch块: IDialogView dialog = null; try { if (_dialogViewModel == null) { dialog = ViewFactory.SomeDialog(); _dialogViewModel = new DialogViewModel(dialog); _dialogV

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

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

问题是:您确实有一个错误,并且该错误正在重复发生。这意味着您可以在崩溃或重复显示对话框之间进行选择。或者,您可以对错误采取措施

您的答案是:修复错误


(你的处理程序可以处理其他错误。保留它。但是这个特定的错误,你需要马上修复。)

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

问题是:您确实有一个错误,并且该错误正在重复发生。这意味着您可以在崩溃或重复显示对话框之间进行选择。或者,您可以对错误采取措施

您的答案是:修复错误


(您的处理程序对于其他错误没有问题。请保留它。但是此特定错误需要立即修复。)

CanExecute
中发生的错误是什么?也许应该改为修复?您可以尝试禁用按钮上的事件,即删除按钮。单击()事件处理程序。是的,我已经阅读了建议改为修复错误或删除处理程序。但通过这种方式,每个错误都可以通过自己的方式修复或避免,但问题是必须首先发现错误。错误将被修复,但我希望我的应用程序不会在下次发生遗漏的异常时崩溃。catch的过去时是出于兴趣。。。您发布的代码不在CanExecute方法中,是吗?在
CanExecute
中发生的错误是什么?也许应该改为修复?您可以尝试禁用按钮上的事件,即删除按钮。单击()事件处理程序。是的,我已经阅读了建议改为修复错误或删除处理程序。但通过这种方式,每个错误都可以通过自己的方式修复或避免,但问题是必须首先发现错误。错误将被修复,但我希望我的应用程序不会在下次发生遗漏的异常时崩溃。catch的过去时是出于兴趣。。。您发布的代码不在CanExecute方法中,是吗?很明显,我必须修复错误。但是有没有办法消除所有的错误呢?因为如果我注意到
CanExecute
中的错误,我仍然不能确定不会再有类似的情况。有什么我应该知道的吗?你说的“消除所有错误”是什么意思?你可以修复错误-这是好的-或者你可以忽略错误-这是坏的-或者你可以允许错误使应用程序崩溃-这是默认的,对于你不希望看到的错误(比如说,“内存不足”)通常是好的。你盲目忽略的每一个错误都会使你的应用程序更加不稳定。我指的是对话框中的所有错误,比如这一个,所以只有对话框会崩溃,而不是整个应用程序。错误不会被盲目忽略,它们会在之后被修复,因为我们会得到错误日志;为了满足这个要求,你没有什么别的办法了。很明显,我必须修正这个错误。但是有没有办法消除所有的错误呢?因为如果我注意到
CanExecute
中的错误,我仍然不能确定不会再有类似的情况。有什么我应该知道的吗?你说的“消除所有错误”是什么意思?你可以修复错误-这是好的-或者你可以忽略错误-这是坏的-或者你可以允许错误使应用程序崩溃-这是默认的,对于你不希望看到的错误(比如说,“内存不足”)通常是好的。你盲目忽略的每一个错误都会使你的应用程序更加不稳定。我指的是对话框中的所有错误,比如这一个,所以只有对话框会崩溃,而不是整个应用程序。错误不会被盲目忽略,它们会在之后被修复,因为我们会得到错误日志;要满足这一要求,你没有其他办法。