C# Language Try / Catch / Finalement


Exemple

6,0

A partir de C # 6.0, le mot-clé await peut maintenant être utilisé dans un bloc catch et finally .

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

Avant C # 6.0, vous deviez faire quelque chose comme suit. Notez que 6.0 a également nettoyé les vérifications NULL avec l' opérateur 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;
}

Notez que si vous attendez une tâche non créée par async (par exemple, une tâche créée par Task.Run ), certains débogueurs peuvent casser des exceptions lancées par la tâche, même si elle est apparemment gérée par la méthode try / catch environnante. Cela se produit car le débogueur considère qu'il n'est pas géré par rapport au code utilisateur. Dans Visual Studio, il existe une option appelée "Just My Code" , qui peut être désactivée pour empêcher le débogueur de se briser dans de telles situations.