我试图掌握 .NET 标准,当 .NET 异常被抑制、吞下或通过时被忽视,以便检测/怀疑/预防/对此类事件保持警惕。
.NET Framework 4.5 上的 MSDN 在线文章“计时器类”指出:
在 .NET Framework 2.0 版及更早版本中,Timer 组件捕获并抑制由 Elapsed 事件的事件处理程序引发的所有异常。此行为可能会在 .NET Framework 的未来版本中发生变化
嗯,.NET 4.5 是与 .NET 2.0 相关的未来版本吗?
虽然这是一个修辞问题,但我不太关心文档中提到的具体案例。
我关心并想了解的是:
抑制.NET异常的标准、原则和基本原理是什么?
更新(回应Eugen Rieck 的回答:
所以问题是:哪个线程应该受到计时器滴答时抛出的异常的影响?
引用 MSDN 文章“异常处理(任务并行库) ”:
如果您不等待传播异常的任务或访问其 Exception 属性,则在对任务进行垃圾收集时,将根据 .NET 异常策略升级异常。
(有趣的“.NET 异常政策”,我在任何地方都找不到……)
好吧,我对 WPF 应用程序很感兴趣,据我所知,它是 STA 并且有一个主父线程。
我的愿望是,如果未处理任何异常,它会崩溃。
Update2(回应马特史密斯的评论):
是的,我知道。引用<ThrowUnobservedTaskExceptions>
元素:
如果未观察到与 Task 关联的异常,则没有 Wait 操作,未附加父级,并且未读取 TaskException 属性,则认为未观察到任务异常。
在 .NET Framework 4 中,默认情况下,如果对具有未观察到的异常的任务进行垃圾回收,则终结器会引发异常并终止进程。进程的终止由垃圾收集和终结的时间决定。
为了让开发人员更轻松地编写基于任务的异步代码,.NET Framework 4.5 更改了这种未观察异常的默认行为。未观察到的异常仍然会引发 UnobservedTaskException 事件,但默认情况下,进程不会终止。相反,无论事件处理程序是否观察到异常,都会在引发事件后忽略异常。
在 .NET Framework 4.5 中,您可以使用应用程序配置文件中的元素来启用 .NET Framework 4 引发异常的行为。
我只是跳过进一步讨论以避免问题的膨胀并获得对斯蒂芬图布的“.NET 4.5中的任务异常处理”的解释的参考
毕竟问题是(真的想从这个问题开始)以确保为我:
- MSDN“异常处理(任务并行库)”中是否提到了一个通用的“.NET异常策略” ,以便在一个地方明确制定?
- 它是.NET 版本相关的还是独立的?
- 它是在哪里制定的?