我有一个简单的异步方法,它使用LoadAsync异步加载实体。我无法捕获异步调用抛出的异常。调试只会导致'AggregateException未被用户代码处理。'我正在使用RavenDB Client 2.0.2375。
如何捕捉这些例外?
以下是方法:
private async Task<Dummy> GetDummyAsync(string id)
{
using (var session = docStore.OpenAsyncSession())
{
try
{
var dummy = await session.LoadAsync<Dummy>(id);
return dummy;
}
catch (Exception ex)
{
return null;
}
}
}
修改
以下是例外:
System.AggregateException未被用户代码处理
的HResult = -2146233088
消息=发生了一个或多个错误。
来源= mscorlib程序
堆栈跟踪:
在System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
在System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task
1.get_Result()
在Raven.Client.Connection.HttpJsonRequest。&lt;&gt; c_ DisplayClassc.b _9()在c:\ Builds \ RavenDB-Stable \ Raven.Client.Lightweight \ Connection \ HttpJsonRequest.cs:line 128
at Raven.Client.Connection.HttpJsonRequest.ReadJsonInternal(Func 1 getResponse) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:line 351
at Raven.Client.Connection.HttpJsonRequest.<InternalReadResponseStringAsync>b__8(Task
1 task)in c:\ Builds \ RavenDB-Stable \ Raven.Client.Lightweight \ Connection \ HttpJsonRequest.cs:line 128
在System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
InnerException: System.Net.WebException
HResult=-2146233079
Message=The remote server returned an error: (404) Not Found.
Source=System
StackTrace:
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar,Func 2 endFunction, Action
1 endAction,Task`1 promise,Boolean requiresSynchronization)
InnerException:
答案 0 :(得分:4)
您所看到的行为是有效的,而不是因为您无法捕获异常。这是因为你已经抓住了这个例外。
在RavenDB中,如果您尝试加载不存在的文档,Load
或LoadAsync
方法将返回null
。他们不会抛出异常。
在进行调试时,您会看到当HTTP响应返回404时,引发了WebException
。处理该异常。您应该在输出窗口中将其视为“First Chance Exception”。
这都是正常行为。如果要检查是否可以捕获异常,请尝试实际抛出异常的内容。也许在尝试将其转换为另一种文档时加载一种类型的文档。这肯定会引发异常。