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块不会被调用,但我收到一条消息,说应用程序崩溃了。问题出在哪里?我该如何解决?
您描述的代码应该可以很好地处理异常。
但是,会使应用程序崩溃的是在async void
方法内部引发的异常,因为该异常内部没有要存储的Task
。
所以,我的猜测是SyncFunction
实际上看起来更像这样:
public override async void SyncFunction()
{
throw new IOException("test");
}
当您调用它时,异常会被发布到ThreadPool
线程,从而使应用程序崩溃。
如果是这种情况,除非在UI事件处理程序中,否则不要使用async void
,并确保通过注册到AppDomain.CurrentDomain.UnhandledException
事件来处理此类异常。