【发布时间】:2022-01-17 14:22:19
【问题描述】:
我想正确理解在没有异常处理的情况下未能观察到Task 上抛出的异常的后果,并且忘记了异常处理方式。
下面是 Jeffry Richter 的 C# 第三版 CLR 的摘录:“[...] 当 Task 对象被垃圾回收时,它的 Finalize 方法会检查 Task 是否遇到未观察到的异常; 如果有,Task 的 Finalize 方法会抛出[异常]。由于您无法捕获 CLR 的终结器线程抛出的异常,因此您的进程将立即终止。”
我正在编写一些测试代码来导致终止,但无法导致终止。
使用测试代码here,我可以看到TaskScheduler.UnobservedTaskException 处理程序被调用。但是,如果我注释掉事件处理程序订阅,异常似乎被吞没了,不会导致程序终止。
我已经在版本 4 和 4.8 上使用 .NET Framework 和 Release 版本进行了尝试。
我如何证明未能观察到在 Task 上引发的异常确实会导致崩溃?
【问题讨论】:
-
您确定您实际上一直在 .NET 4 上运行,而不仅仅是针对 .NET 4 而是在 4.5+ 上运行?根据docs.microsoft.com/en-us/dotnet/api/…,您可以在 app.config 中针对每个应用程序进行配置,但默认设置是不立即使应用程序崩溃。
-
谢谢@JonSkeet 我想就是这样。添加
<ThrowUnobservedTaskExceptions enabled="true"/>确实会按预期使程序崩溃。 -
乔恩你有时间在这里发布答案吗?
-
不,您可以自己添加答案。
标签: c# .net exception task-parallel-library