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