TryCatchFinally

Version >= 6

從 C#6.0 開始,await 關鍵字現在可以在 catchfinally 塊中使用。

try {
   var client = new AsyncClient();
   await client.DoSomething();
} catch (MyException ex) {
   await client.LogExceptionAsync();
   throw;
} finally {
   await client.CloseAsync();
}

Version < 6.0

在 C#6.0 之前,你需要執行以下操作。請注意,6.0 還使用 Null Propagating 運算子清除了空檢查。

AsynClient client;
MyException caughtException;
try {
     client = new AsyncClient();
     await client.DoSomething();
} catch (MyException ex) {
     caughtException = ex;
}

if (client != null) {
    if (caughtException != null) {
       await client.LogExceptionAsync();
    }
    await client.CloseAsync();
    if (caughtException != null) throw caughtException;
}

請注意,如果等待 async 建立的任務(例如 Task.Run 建立的任務),某些偵錯程式可能會破壞任務丟擲的異常,即使它看起來是由周圍的 try / catch 處理的。發生這種情況是因為偵錯程式認為它對使用者程式碼未處理。在 Visual Studio 中,有一個名為 Just My Code 的選項,可以禁用該選項以防止偵錯程式在這種情況下中斷。