1

我试图掌握 .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中的任务异常处理”的解释的参考

毕竟问题是(真的想从这个问题开始)以确保为我:

4

2 回答 2

1

这是该政策的链接(在 .net 2.0 中已更改),此后一直保持不变:http: //msdn.microsoft.com/en-us/library/ms228965.aspx

于 2013-05-21T03:49:19.327 回答
1

很可能这只是一个实现问题:

  • 计时器滴答在线程池线程上运行
  • 定时器本身不属于线程
  • 创建计时器的线程可能不再运行(或存在)

所以问题是:哪个线程应该受到计时器滴答时抛出的异常的影响?对此没有简单的答案,因此简单地抑制异常(即运行每个刻度并try ... catch在其周围隐含)是回避这个问题的一种方法。

于 2013-05-19T16:24:47.997 回答