.net - 全局异常处理程序可以处理等待函数中的异常吗?
问题描述
我有一个 WPF 桌面应用程序,它在后台线程中调用任务,如下所示:
private async void SomeButton_Click(object sender, EventArgs e)
{
await Task.Run(async () =>
{
await DoSomething();
});
}
public async Task DoSomething()
{
//do something that throws an exception, mocked like this
throw new Exception("Test");
}
我在 App 启动中有顶级异常处理程序,如下所示:
this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
这些处理程序都只是将异常记录到文件中。
如果我将 的全部内容DoSomething
放在 try/catch 块中,则 catch 起作用并且任务完成。
但是,如果抛出了不在 try/catch 中的异常,则将调用CurrentDomain_UnhandledException
处理程序,但该IsTerminating
属性为 true,并且应用程序崩溃。
如何设置一个全局异常处理程序来处理异常而不使我的进程崩溃,而不必将 try/catch 处理放在可能在非 Dispatcher 线程上调用的每个方法中?
解决方案
在OnDispatcherUnhandledException
事件处理程序中,您应该将Handled
属性设置为true
.
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// log
e.Handled = true;
}
推荐阅读
- python-sphinx - 检查从 sphinx 扩展生成的 ReST
- javascript - 有没有办法让javascript在svg世界地图上绘制纬度和经度线?
- node.js - Puppeteer 性能泄漏
- swift - 有没有一种特定的方法可以将 DispatchWorkItems 附加到 DispatchQueue 而不是在代码中重新声明它们?
- php - 为什么
- python - Creating an object that asks the user to enter a desired user id and stores this id
- powershell - 如何修复无法转换 system.object[] 错误
- vba - 根据多列中的重复项组合、求和并取最大值
- angular - 有没有办法在构建时修改装饰器选项?
- c++ - __LINE__ 在 MSVC 中不是 constexpr