C# 尽管等待任务并捕获异常,但未观察到的异常仍被重试
我的代码捕获服务器调用引发的所有异常,如下所示:C# 尽管等待任务并捕获异常,但未观察到的异常仍被重试,c#,.net,exception,xamarin.ios,async-await,C#,.net,Exception,Xamarin.ios,Async Await,我的代码捕获服务器调用引发的所有异常,如下所示: new public Task SaveAsync() { return ServerException.Wrap(base.SaveAsync); } try { await problem.SaveAsync(); } catch (ServerException ex) {
new public Task SaveAsync()
{
return ServerException.Wrap(base.SaveAsync);
}
try
{
await problem.SaveAsync();
}
catch (ServerException ex)
{
Logger.LogException("Error saving problem.", ex);
}
其中ServerException.Wrap看起来像:
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;
});
}
我有一个内部错误,它生成了一个异常,我在上面的一行中捕获到该异常,然后它被记录如下:
new public Task SaveAsync()
{
return ServerException.Wrap(base.SaveAsync);
}
try
{
await problem.SaveAsync();
}
catch (ServerException ex)
{
Logger.LogException("Error saving problem.", ex);
}
2015-10-20 11:20:44.502[第99行]错误保存问题。(例外情况:
Exceptions.ServerException:-->System.ArgumentException:一个项目
已添加具有相同密钥的。位于
System.ThrowHelper.ThrowArgumentException(例外资源)
[0x00000]英寸
/Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74
但几秒钟后,我收到一条未经处理的异常警告,该警告已被记录:
2015-10-20 11:21:16.352警告:未处理的异常:
System.AggregateException:未观察到任务的异常
通过等待任务或访问其Exception属性
结果,未观察到的异常被终结器重新调用
线程。-->System.ArgumentException:具有相同键的项具有
已添加。位于System.ThrowHelper.ThrowArgumentException
(例外资源)[0x00000]位于
/Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74
为什么我会得到第二个未观察到的异常,即使我正在捕获并处理第一个异常?这个异常似乎是由我的ServerException.Wrap方法引发的
我使用的是MonoTouch。您需要将异常显式设置为“已观察” 为此,您需要订阅
TaskScheduler
的unobservedtaskeexception
事件,并将其显式设置为observed
(对其调用SetObserved()
请看这里:
编辑:
当然,您也可以捕获aggregateeexception
,或者使用ContinueWith()观察并恢复任务
见官方文件的底部:
为什么一开始就不注意它?你确定这是所有相关的代码吗?这是简化版。你还需要代码的哪些部分?不等待任务的部分:)SaveAsync的外观如何?@KostubDeshmukh:请发布最小的、可复制的代码。这样我们也可以看到错误。我在MonoTouch上也遇到了类似的问题。你找到解决这个问题的办法了吗?