我的代码可以捕获服务器调用引发的所有异常,如下所示:
new public Task SaveAsync()
{
return ServerException.Wrap(base.SaveAsync);
}
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;
});
}
然后我有一个调用SaveAsync的函数如下:
try
{
await problem.SaveAsync();
}
catch (ServerException ex)
{
Logger.LogException("Error saving problem.", ex);
}
我有一些内部错误会产生一个异常,我会在上面的行中找到它然后按如下方式记录:
2015-10-20 11:20:44.502 [第99行]保存问题时出错。 (例外: Exceptions.ServerException:---&gt; System.ArgumentException:一个项目 已经添加了相同的密钥。在 System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) [0x00000] in /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属性。如 结果,终结器重新抛出了未观察到的异常 线。 ---&GT; System.ArgumentException:具有相同键的项目 已被添加。在System.ThrowHelper.ThrowArgumentException (ExceptionResource资源)[0x00000] in /Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74
为什么我会得到第二个未观察到的异常,即使我正在捕捉并处理第一个异常?我的ServerException.Wrap方法似乎抛出了这个异常。
我正在使用MonoTouch。
答案 0 :(得分:-1)
您需要明确将异常设置为观察到的。
为此,您需要订阅/%listing-category%/%listing-child%/
的{{1}}事件,并将其明确设置为TaskScheduler
(在其上调用SetObserved())。
见这里:
UnobservedTaskException being throw...
编辑:
当然,您也可以只捕获UnobservedTaskException
,或使用ContinueWith()来观察和恢复任务。
请参阅官方文档的底部: