我知道在使用Task
时如何处理无法处理的异常,如果用户代码尚未“观察”它,则只会在终结器中抛出未处理的异常。
我也知道异步线程中的未处理异常(例如Action.BeginInvoke()
)是如何在加入的调用中被捕获并重新抛出的(例如Action.EndInvoke()
)。
我不明白的是,这不会导致这个过程失败吗?
static void Main(string[] args)
{
var timer = new System.Timers.Timer() {Interval = 100};
timer.Elapsed += (o, e) => { throw new Exception(); };
timer.Start();
Console.ReadKey( true );
}
答案 0 :(得分:9)
从.NET 4.0文档:
在.NET Framework 2.0及更早版本中,Timer组件 捕获并抑制事件处理程序抛出的所有异常 经历的事件。此行为在将来的版本中可能会更改 .NET Framework。
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
尚未声明此行为实际已发生变化。