尽管等待任务并捕获异常,但未观察到的异常被重新抛出
本文关键字:观察 异常 新抛出 等待 任务 捕获异常 | 更新日期: 2023-09-27 18:18:37
我的代码捕获了由服务器调用抛出的所有异常,如下所示:
new public Task SaveAsync()
{
return ServerException.Wrap(base.SaveAsync);
}
ServerException的地方。换行看起来像:
public static async Task<T> Wrap<T>(Func<Task<T>> func)
{
try
{
return await func();
}
catch (Exception ex)
{
// This is an internal error that shouldn't happen.
throw new ServerException(ex);
}
}
public static async Task Wrap(Func<Task> func)
{
await Wrap(async () =>
{
await func();
return true;
});
}
然后我有一个函数调用SaveAsync如下:
try
{
await problem.SaveAsync();
}
catch (ServerException ex)
{
Logger.LogException("Error saving problem.", ex);
}
我有一些内部错误,产生了一个异常,我在上面的行中捕获,然后它被记录如下:
2015-10-20 11:20:44.502 [Line 99]保存错误。(例外:例外。ServerException:——> System。ArgumentException:一个项已经添加了相同的键。在System.ThrowHelper.ThrowArgumentException(例外资源)[0 x00000]/用户/建筑/数据/道/1977/2c66d2fe/源/mono/外部/referencesource/mscorlib/系统/throwhelper.cs: 74
然而,几秒钟后,我得到一个未处理的异常警告,并被记录下来:
2015-10-20 11:21:16.352警告:未处理异常:系统。AggregateException:未观察到任务的异常要么等待任务,要么访问它的Exception属性。作为结果,未观察到的异常被终结器重新抛出线程。——>系统。ArgumentException:具有相同键的项有已经添加。在System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) [0x00000] in/用户/建筑/数据/道/1977/2c66d2fe/源/mono/外部/referencesource/mscorlib/系统/throwhelper.cs: 74
为什么我得到第二个未观察到的异常,即使我捕获并处理了第一个异常?这个异常似乎是由我的ServerException抛出的。包装方法。
我用的是MonoTouch
您需要显式地将异常设置为观察。
为此,您需要订阅TaskScheduler
的UnobservedTaskException
事件,并将其显式设置为observed
(在其上调用setobserve()))。
看到:
observedtaskexception被抛出…
编辑:当然,您也可以只捕获AggregateException
,或者使用ContinueWith()来观察并恢复任务。
见官方文档底部:
MSDN异常处理