TryCatchFinally
Version >= 6
從 C#6.0 開始,await
關鍵字現在可以在 catch
和 finally
塊中使用。
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
的選項,可以禁用該選項以防止偵錯程式在這種情況下中斷。