在未处理的异常中显示消息对话框

6
在我的应用中,当出现任何未处理的异常时,我希望显示一条消息对话框。但是似乎当抛出未处理的异常时,对话框消息没有出现,显示消息弹出框是否有效?此外,在MSDN文档中,我没有找到太多有关它的信息。
下面是我使用的测试代码:
public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;
    this.UnhandledException += App_UnhandledException;
}

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageDialog dialog = new MessageDialog("Unhandled Execption", "Exception");
    await dialog.ShowAsync();
}

1
你尝试过调用Dialog.Show的同步版本吗? - Hamlet Hakobyan
2
你的应用程序可能会被终止,因为你正在使用异步事件处理程序。 - Biesi
“显示消息弹窗”是否有效?-您对“有效”的定义是什么?在意外错误方面向用户呈现消息可能会方便用户,因为应用程序不会“无缘无故”关闭。所以,在我看来,这是个好主意。我会添加关于接下来该怎么做的信息(联系支持,发送日志...)。 - Fildor
1个回答

9
可以实现,但需要确保在显示消息对话框之前将UnhandledExceptionEventArgs.Handled属性设置为true。如果未设置Handled属性,操作系统会在事件处理程序返回后立即终止应用程序,因此在执行到await dialog.ShowAsync()时应用程序会立即终止。由于应用程序被立即终止,您甚至都没有机会看到对话框。
理想的实现方式如下:
private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    e.Handled = true;
    MessageDialog dialog = new MessageDialog("Unhandled Execption", "Exception");
    await dialog.ShowAsync();
    Application.Exit();
}

当用户确认MessageDialog后,应用程序将被编程终止。 这是一个好的做法,因为在未处理的异常之后,我们很可能不知道应用程序处于什么状态,也很可能无法恢复。您还可以执行某种形式的日志记录或向用户提供发送错误报告的选项。


但是,在那个点上没有办法阻止应用程序继续执行吗? - visc
是的,使用 Application.Exit() 调用可以强制终止它。 - Martin Zikmund
是的,但应用程序执行会继续运行,直到用户关闭对话框?因此,如果任务中抛出未处理的异常,它将被您的处理程序捕获,但应用程序的其他部分将继续运行,直到用户关闭对话框。 - visc
那实际上是正确的,说得好。但由于对话框是模态的,用户将无法与应用程序交互。因此,这取决于在这种情况下是否存在可能会引起问题的东西。 - Martin Zikmund
设置e.Handled并没有阻止VS 2017显示自己的对话框,也没有调用JIT调试器进程附加提示。 - RashadRivera
1
很好的回答。我唯一建议的是使用ContentDialog;MessageDialog更多地是一个遗留的Windows 8组件。 - Mapplesoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接