【问题标题】:exception generated inside an await block is not catched in try catch block在等待块内生成的异常未在 try catch 块中捕获
【发布时间】:2015-02-09 15:39:39
【问题描述】:

我有一个同步功能,例如以下会产生 IO 错误的功能(为了简单起见,我删除了细节):

public override void SyncFunction()
{
   throw new IOException("test");
}

我是这样使用的:

try
{
    await Task.Run(() => this.SyncFunction());
}
catch (Exception ex)
{
    MessageBox.Show("Error:"+Environment.NewLine + ex.Message);
}

但是当我运行应用程序时,catch 块没有被调用,但是我收到了一条应用程序崩溃的消息。有什么问题,我该如何解决?

【问题讨论】:

  • 我怀疑这实际上是代码。此代码应处理异常。

标签: c# exception asynchronous try-catch async-await


【解决方案1】:

您描述的代码应该可以很好地处理异常。

但是,会让您的应用程序崩溃的是在 async void 方法中抛出的异常,因为该异常没有要存储在其中的 Task。

所以,我猜SyncFunction 实际上看起来更像这样:

public override async void SyncFunction()
{
    throw new IOException("test");
}

当您调用它时,异常会发布到ThreadPool 线程,这会导致应用程序崩溃。

如果是这种情况,除非在 UI 事件处理程序中,否则不要使用 async void,并确保通过注册到 AppDomain.CurrentDomain.UnhandledException 事件来处理此类异常。

【讨论】:

  • SyncFunction 是接口的一部分,我可以在不破坏接口完整性的情况下用异步装饰它吗?
  • @mans 是的。 async 是方法的实现细节。但请记住,重点是不要使用async void
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多