C# .NET抑制异常(可能未记录)案例背后的基本原理是什么?

C# .NET抑制异常(可能未记录)案例背后的基本原理是什么?,c#,exception-handling,task-parallel-library,conceptual,C#,Exception Handling,Task Parallel Library,Conceptual,我正试图掌握.NET标准,即当.NET异常被抑制、吞并或传递时,为了检测/怀疑/防止/警惕此类事件,在不被注意的情况下 .NET Framework 4.5上的MSDN在线文章“计时器类”指出: 在.NET Framework 2.0及更早版本中,计时器组件 捕获并抑制事件处理程序为 经过的事件。此行为可能会在将来的版本中发生更改 NET框架的应用 嗯,相对于.NET2.0,.NET4.5已经是未来的版本了吗? 虽然这是一个反问句,我不太关心文件中提到的具体案例 我真正关心并想了解的是: 抑制.

我正试图掌握.NET标准,即当.NET异常被抑制、吞并或传递时,为了检测/怀疑/防止/警惕此类事件,在不被注意的情况下

.NET Framework 4.5上的MSDN在线文章“计时器类”指出:

在.NET Framework 2.0及更早版本中,计时器组件 捕获并抑制事件处理程序为 经过的事件。此行为可能会在将来的版本中发生更改 NET框架的应用

嗯,相对于.NET2.0,.NET4.5已经是未来的版本了吗?
虽然这是一个反问句,我不太关心文件中提到的具体案例

我真正关心并想了解的是:
抑制.NET异常的标准、原则和基本原理是什么

更新(回应:
所以问题是:哪个线程应该受到am异常的约束 在计时器的滴答声中抛出

引用MSDN文章“”:

如果您不等待传播异常的任务,或 它的Exception属性,根据 垃圾收集任务时的.NET异常策略

(有趣的“.NET例外策略”,我在任何地方都找不到…)

嗯,我对WPF应用程序感兴趣,据我所知,它是STA,有一个主父线程。
我的愿望是,如果任何异常未处理,它就会崩溃

更新2(回应Matt Smith的评论): 是的,我知道。 引用:

如果未观察到与任务关联的异常, 没有等待操作,父级未连接,并且 未读取TaskException属性。已考虑任务异常 不被注意

在.NET Framework 4中,默认情况下,如果任务具有 未观察到的异常被垃圾收集,终结器抛出 异常并终止进程。进程的终止 由垃圾收集和终结的时间决定

使开发人员更容易基于 NET Framework 4.5更改了任务的此默认行为 未观察到的异常。未观察到的异常仍然会导致 要引发的UnobservedTaskException事件,但默认情况下 进程不会终止。相反,在 无论事件处理程序是否观察到,都会引发该事件 例外

在.NET Framework 4.5中,您可以使用 应用程序中的元素 用于启用.NET Framework 4抛出行为的配置文件 例外

我只是跳过了进一步的讨论,以避免问题的浮夸,并得到了解释的参考

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

  • 是否有一个在中提到的通用“.NET例外政策”,以便在一个地方明确制定
  • 它是依赖于.NET版本还是独立于.NET版本
  • 它是在哪里制定的

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

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

所以问题是:哪个线程应该受到计时器滴答声引发的异常的影响?这个问题没有简单的答案,所以简单地抑制异常(即,在每个滴答声周围运行一个隐含的
try…catch
)是回避这个问题的一种方法自那时以来,情况一直保持不变:

“哪个线程应该受到计时器滴答声引发的am异常的影响?”在我看来,它应该被传播到主应用程序线程,如果它没有得到处理,就会使应用程序崩溃。你的观点在第一次阅读时似乎是合乎逻辑的,但是如果计时器是由线程创建的,那么当计时器错误触发时就不再运行,这有点像PITA:我们应该通知计时器的创建者,但我们不能从线程池(或任务)线程生成的子进程被抑制,因为它的线程被重用,“我们”不知道创建者是否通知它?按照相同的逻辑,“我们”将无法在关闭应用程序时关闭这些子进程。在.net 4.5中,您提到的未观察到的任务异常被默默地吞没在.NET4.0中,行为是终止应用程序。