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 } });