无法捕获到async await的错误
- 2020 年 2 月 14 日
- 笔记
最近在做.net项目中遇到无法捕获到错误的问题,即使在全局的错误捕获中,也依然没有捕获到,直接造成系统奔溃,究其原因是用了async void 的方法,async void是要避免使用的,详情可以看MSDN这篇文章: https://docs.microsoft.com/zh-CN/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming
如下代码是错误的:
public async void Foo() { var x = await DoSomethingAsync(); } public void DoFoo() { try { Foo(); } catch (Exception ex) { // 这里永远不会被捕获到 } }
根据MSDN文章以下代码才是最佳做法:
// 最重要的是需要捕获错误的方法,要避免async void,改成 async Task public async Task Foo() { var x = await DoSomethingAsync(); } public async void DoFoo() { try { await Foo(); } catch (Exception ex) { // 这里可捕获到错误 } } //或// public void DoFoo() { try { Foo().Wait(); } catch (Exception ex) { // 这里可捕获到错误 } }