1

我们有一个 WPF 应用程序,其中:

private void SomeHandler(object sender, RoutedEventArgs e)
{
  Task.Factory.StartNew(LoadItems).ContinueWith(t =>
  {
    //cache items to, for instance, db
  }, TaskContinuationOptions.NotOnFaulted);
}

private void LoadItems()
{
//sometimes it throws an exception
//this is expected
throw new FormatException("blablabla");
}

所以,一般来说,当数据存在时,我们使用这个处理程序来尝试缓存数据。如果它不存在,那么我们会得到一个 Formatexception。我们不关心结果,只关心“一劳永逸”的策略。

我最近从客户端获得了两个日志文件,其中我看到 FormatException 已传播到 CurrentDomain_UnhandledException 处理程序。所有客户端都在带有 .Net 4.0 的 Windows XP 上。

所以问题是为什么会这样?是按照设计的吗?

4

1 回答 1

2

这是 .Net 4.0 上的预期行为。如果存在Task异常并且从未观察到该异常,则在Task最终确定时重新抛出该异常。

如果您安装了 .Net 4.5 并且想要获得此行为(例如用于测试),请添加<ThrowUnobservedTaskExceptions>到 app.config

如果您想确保不会重新Task抛出未观察到的异常,即使在 .Net 4.0 上,您也可以使用TaskScheduler.UnobservedTaskException

TaskScheduler.UnobservedTaskException += (o, args) => args.SetObserved();

但我认为这里最好的选择是明确地观察异常。您可以通过删除NotOnFaulted选项并检查Exception属性来做到这一点:

Task.Factory.StartNew(LoadItems).ContinueWith(t =>
{
  if (t.Exception == null)
  {
    //cache items to, for instance, db
  }
});
于 2013-10-18T10:17:38.313 回答