Le débogueur ne casse pas / ne s’arrête pas pour les exceptions dans la méthode asynchrone

Lorsqu’un débogueur est associé à un processus .NET, il s’arrête (généralement) lorsqu’une exception non gérée est levée.

Cependant, cela ne semble pas fonctionner lorsque vous utilisez une méthode async .

Les scénarios que j’ai essayés auparavant sont répertoriés dans le code suivant:

 class Program { static void Main() { // Debugger stopps correctly Task.Run(() => SyncOp()); // Debugger doesn't stop Task.Run(async () => SyncOp()); // Debugger doesn't stop Task.Run((Func)AsyncTaskOp); // Debugger stops on "Wait()" with "AggregateException" Task.Run(() => AsyncTaskOp().Wait()); // Throws "Exceptions was unhandled by user code" on "await" Task.Run(() => AsyncVoidOp()); Thread.Sleep(2000); } static void SyncOp() { throw new Exception("Exception in sync method"); } async static void AsyncVoidOp() { await AsyncTaskOp(); } async static Task AsyncTaskOp() { await Task.Delay(300); throw new Exception("Exception in async method"); } } 

Est-ce que je manque quelque chose? Comment puis-je faire en sorte que le débogueur s’arrête à l’exception de AsyncTaskOp() ?

Dans le menu Debug , sélectionnez Exceptions... Dans la boîte de dialog Exceptions, en regard de la ligne Common Language Runtime Exceptions , cochez la case Thrown .

J’aimerais savoir si quelqu’un a découvert comment contourner ce problème? Peut-être un réglage dans le dernier studio visuel …?

Une solution désagréable mais réalisable (dans mon cas) consistait à lancer ma propre exception, puis à modifier la réponse de Stephen Cleary:

Dans le menu Déboguer, sélectionnez Exceptions (Vous pouvez utiliser ce raccourci clavier Contrôle + Alt + E ) … Dans la boîte de dialog Exceptions, à côté de la ligne Exceptions Common Language Runtime, cochez la case Thrown.

pour être plus précis, c.-à-d., ajoutez votre Exception personnalisée dans la liste, puis cochez sa case “Thrown”.

Par exemple:

 async static Task AsyncTaskOp() { await Task.Delay(300); throw new MyCustomException("Exception in async method"); } 

J’ai enveloppé le délégué anonyme dans un try / catch dans le Task.Run(() => .

 Task.Run(() => { try { SyncOp()); } catch (Exception ex) { throw; // <--- Put your debugger break point here. // You can also add the exception to a common collection of exceptions found inside the threads so you can weed through them for logging } });