C#怎么在子线程中抛出异常_C#如何正确捕获Task错误【必备】

张开发
2026/6/27 18:07:04 15 分钟阅读
C#怎么在子线程中抛出异常_C#如何正确捕获Task错误【必备】
子线程throw的异常主线程无法捕获.NET不会自动冒泡应优先用Task/async-await裸Thread需手动try-catch并传递异常Task异常封装为AggregateExceptionawait可自动解包task.Wait()/Result则抛AggregateExceptionasync void异常无法捕获且会崩溃进程仅限UI事件且须内部try-catchUnobservedTaskException非兜底机制仅记录被忽略异常不可依赖。子线程里 throw 的异常根本不会被主线程 try-catch 捕获这是最常被误解的一点直接在 Thread 启动的方法里 throw主线程的 try/catch 完全收不到。.NET 不会把子线程异常“冒泡”到创建它的线程而是直接终止该线程并可能让整个进程崩溃尤其在 .NET Framework 旧版本中。实操建议别用裸 Thread 做需要错误反馈的任务改用 Task 或 async/await如果必须用 Thread得自己加包装在线程入口方法里 try/catch把异常存到共享变量或通过回调通知主线程Thread 的 UnobservedTaskException 事件不适用于裸线程只对 Task 生效Task.Run 中 throw 会触发 AggregateException不是原始异常类型Task 把多个可能的异常打包进 AggregateException哪怕只抛了一个 NullReferenceException你 catch 到的也是它不是原异常本身。常见错误现象写 catch (NullReferenceException) 却捕不到因为实际抛出的是 AggregateException。实操建议总是先 catch (AggregateException ex)再用 ex.InnerException 或 ex.Flatten().InnerExceptions 取出原始异常更推荐用 await异步方法里 throw 会被自动解包await task 后 catch 到的就是原始异常类型task.Wait() 和 task.Result 都会抛 AggregateExceptionawait task 不会async void 方法里的异常会直接炸掉进程无法捕获async void 是唯一能让异常“逃逸”出所有 try/catch 的合法 C# 写法。它没有返回 Task所以没人能观察它、等待它、处理它的异常。使用场景仅限事件处理器比如按钮点击且必须确保内部 try/catch 住所有可能异常。 有道翻译AI助手 有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻

更多文章