我很難理解 async/await 在各種非快樂路徑情況下是如何作業的。例如,我有以下代碼:
class Program
{
static void Main(string[] args)
{
Do();
Console.ReadLine();
}
private static void Do()
{
TaskScheduler.UnobservedTaskException = (s, e) =>
{
Console.WriteLine($"Unobserved Exception : {e.Exception.Message}");
e.SetObserved();
};
try
{
ThrowsAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Caught in try/catch : {ex.Message}");
}
}
private static async Task ThrowsAsync()
{
Console.WriteLine("Throwing");
throw new Exception("FAILURE");
}
}
有兩件事我不明白:
- 該
ThrowsAsync方法是異步的,但是,它不包含任何await. 我會假設在這種情況下,該方法將像“正常”同步方法一樣執行。但是,它拋出的例外永遠不會在catch塊中捕獲。 - 試圖以某種方式捕獲例外,我添加了
TaskScheduler.UnobservedTaskException. 但是,它永遠不會被執行。這是為什么?
我知道如果我等待,例外會被捕獲ThrowsAsync。但是,我正在嘗試更好地了解它的作業原理。
我正在使用 .NET 5 和基于 Linux 的作業系統運行該代碼。
uj5u.com熱心網友回復:
例如,如Stephen Cleary在這篇博客文章中所描述的-
async方法的狀態機將從您的代碼中捕獲例外并將它們放在回傳的任務上,即方法呼叫不會拋出,如果await結果,您將能夠捕獲例外。至于
TaskScheduler.UnobservedTaskException- 查看這個答案并確保在Release模式下運行代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360670.html
上一篇:在Python中使用async/await洗掉Firestore集合
下一篇:當異步行程結束時Kotlin回傳
