为何使用await Task.Run仍触发User-Unhandled异常?如何解决?
关于await Task.Run异常捕获的问题解决
问题原因
Visual Studio调试器默认会在异常抛出时就中断执行,哪怕这个异常后续会被try/catch捕获。这不是真的“未处理异常”,只是调试器的默认行为导致的中断提示。
解决步骤
调整调试器异常设置
- 打开异常设置面板:通过菜单栏「调试」→「Windows」→「异常设置」,或按下快捷键
Ctrl+Alt+E。 - 在面板中找到「公共语言运行时异常」:
- 如果不想让调试器在任何异常抛出时中断,取消勾选该分类下的「抛出」选项;
- 更合理的做法是保持「抛出」勾选,此时调试器只会在异常未被代码捕获时才中断,被try/catch处理的异常只会在输出窗口记录,不会打断调试流程。
确保代码正确使用await
必须保证你确实await了Task.Run返回的任务,否则任务内部的异常会成为未观察到的异常,触发调试器的未处理异常提示。正确示例:
async Task ExecuteTaskWithCatch() { try { await Task.Run(() => { // 模拟抛出异常 throw new ArgumentException("Task内部异常"); }); } catch (ArgumentException ex) { // 成功捕获异常 Console.WriteLine($"捕获到异常:{ex.Message}"); } }
如果省略await,比如直接写Task.Run(...),任务的异常不会被传播到当前try/catch块,就会被调试器判定为未处理异常。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

