無法捕獲到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) { // 這裡可捕獲到錯誤 } }