• 可以用简单的 try/catch 来捕获异常,和同步代码使用的方法一样:
    1. static async Task ThrowExceptionAsync()
    2. {
    3. await Task.Delay(TimeSpan.FromSeconds(1));
    4. throw new InvalidOperationException("Test");
    5. }
    6. static async Task TestAsync()
    7. {
    8. // 抛出异常并将其存储在 Task 中。
    9. Task task = ThrowExceptionAsync();
    10. try
    11. {
    12. // Task 对象被 await 调用,异常在这里再次被引发。
    13. await task;
    14. }
    15. catch (InvalidOperationException)
    16. {
    17. // 这里,异常被正确地捕获。
    18. }
    19. }
    • 关于 asnyc void 方法抛出的异常处理,没什么好的方法,如果可以的话,方法的返回类型不要用 void,把它改为 Task。
    • 最好不要从 async void 方法抛出异常。如果必须使用 async void 方法,可考虑把所有代码放在 try 块中,直接处理异常。