wait块内部生成的异常未在try-catch块中捕获

本文关键字:try-catch 异常 内部 wait | 更新日期: 2024-04-03 08:50:50

我有一个同步函数,比如下面的函数,它会生成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块不会被调用,但我收到一条消息,说应用程序崩溃了。问题出在哪里?我该如何解决?

wait块内部生成的异常未在try-catch块中捕获

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

但是,使应用程序崩溃的是在async void方法内部引发的异常,因为该异常内部没有要存储的Task

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

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

当您调用它时,异常会被发布到ThreadPool线程,从而使应用程序崩溃。

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