debugging器不会在asynchronous方法中打破/停止exception
当一个debugging器连接到一个.NET进程时,它通常会在引发未处理的exception时停止。
但是,当你在一个async
方法,这似乎不工作。
我以前尝试过的场景在以下代码中列出:
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<Task>)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"); } }
我错过了什么吗? 如何使debugging器打破/停止AsyncTaskOp()
的exception?
在Debug
菜单下,selectExceptions...
在“例外”对话框的“ Common Language Runtime Exceptions
旁边,选中“ Thrown
框。
我想听听有没有人发现如何解决这个问题? 也许在最新的视觉工作室的设置…?
一个讨厌但可行的解决scheme(就我而言)是抛出我自己的自定义exception,然后修改斯蒂芬·克莱里的答案:
在debugging菜单下,select例外(您可以使用此键盘快捷键Ctrl + Alt + E )…在例外对话框中,公共语言运行时例外行旁边检查投掷框。
更具体的,即添加您的自定义例外到列表中,然后勾选其“投掷”框。
例如:
async static Task AsyncTaskOp() { await Task.Delay(300); throw new MyCustomException("Exception in async method"); }
我在Task.Run(() =>
中的try / catch中包装了匿名委托。
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 } });