Task.Run块中捕获异常的方式是否正确?调试时VS2019提示未处理异常
Task.Run中异常捕获方式的正确性分析
你这种捕获Task.Run中异常的方式完全正确,不用纠结VS调试时的那个提示——那只是调试器的“过度敏感”而已。
咱们拆解一下来理解:
- 首先看代码逻辑:
Task.Run会把委托里的代码放到线程池执行,一旦委托抛出异常,这个异常会被自动封装到Task.Run返回的Task对象里。当你用await等待这个Task时,.NET会把封装的异常重新抛出,这时候外层的try/catch就会精准捕获到它,所以运行时(非调试状态)程序会正常输出"oops",不会崩溃。 - 那为什么VS2019调试时会弹出“未处理的异常”提示?这是VS调试器的默认行为:它会在异常首次抛出的位置(也就是
Task.Run委托内部)就触发提示,哪怕这个异常后续会被上层的代码捕获处理。如果你不想看到这个提示,可以调整调试设置:打开调试菜单的「异常设置」(快捷键Ctrl+Alt+E),找到「Common Language Runtime Exceptions」,取消勾选它的「抛出」选项,这样调试器只会在异常真的没被捕获时才提示。
另外补充一句:你用await + try/catch的方式处理异步任务异常,本身就是.NET异步编程里推荐的简洁写法,比用ContinueWith之类的方式可读性高太多了。
内容的提问来源于stack exchange,提问作者Noisy88
相关产品推荐
相关产品推荐

