C# Language Try / catch / finally

Esempio

6.0

A partire da C # 6.0, la parola chiave await ora può essere utilizzata all'interno di un blocco catch e finally .

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

Prima di C # 6.0, avresti bisogno di fare qualcosa sulla falsariga di quanto segue. Si noti che 6.0 ha anche ripulito i controlli null con l' operatore 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;
}

Si noti che se si attende un'attività non creata da async (ad esempio un'attività creata da Task.Run ), alcuni debugger potrebbero interrompersi sulle eccezioni generate dall'attività anche se apparentemente gestite dal try / catch circostante. Questo accade perché il debugger lo considera non gestito rispetto al codice utente. In Visual Studio, c'è un'opzione chiamata "Just My Code" , che può essere disattivata per impedire che il debugger si rompa in tali situazioni.