C# 如何从任务中抛出/捕获内部异常?
假设我有一个简单的方法:C# 如何从任务中抛出/捕获内部异常?,c#,winforms,C#,Winforms,假设我有一个简单的方法: private void MyMethod() { try { myService.Do(); } catch (MyException ex) {} } 我有一个使用HttpClient的服务,我做到了: public void Do() { var response = client.GetAsync(url).Result; //Alas it's not async till now } 现在我正在实现一个Delegat
private void MyMethod()
{
try {
myService.Do();
} catch (MyException ex) {}
}
我有一个使用HttpClient
的服务,我做到了:
public void Do()
{
var response = client.GetAsync(url).Result; //Alas it's not async till now
}
现在我正在实现一个DelegatingHandler
,我覆盖SendAsync
:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return await base.SendAsync(request, cancellationToken)
.ContinueWith<HttpResponseMessage>(task =>
{
HttpResponseMessage response = task.Result;
if (response.StatusCode == HttpStatusCode.NotFound)
{
throw new MyException();
}
return response;
}).ConfigureAwait(false);
}
protectedoverride async Task sendaync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
return wait base.sendaync(请求、取消令牌)
.ContinueWith(任务=>
{
HttpResponseMessage response=task.Result;
if(response.StatusCode==HttpStatusCode.NotFound)
{
抛出新的MyException();
}
返回响应;
}).配置等待(错误);
}
在这里抛出MyException
之前,一切都按预期进行。异常冒泡到调用方,但是,异常是一个aggregateException
有没有一种方法可以抛出实际的异常本身,这样就不需要在应用程序范围内进行重大的代码更改?
aggregateException
是许多异常的合并,因为async
方法可以在执行时抛出许多异常。net使用此类返回所有异常
要访问内部异常,它有一个名为
InnerExceptions
的属性,它是一个只读集合,包含所有抛出的异常。aggregateException
是许多异常的合并,作为一个async
方法,它可以在执行时抛出许多异常。net使用此类返回所有异常
要访问内部异常,它有一个名为
InnerExceptions
的属性,它是一个只读集合,包含所有抛出的异常。当在任务中抛出异常时,使用Result
属性,您将获得aggregateeexception
,其中真正的异常位于该aggregateeexception
对象的InnerException
属性中(您的异常由aggregateeexception
包装)
要获取真正的异常(未包装异常),可以使用GetAwaiter().GetResult()
:
您也可以使用Result
属性,但是您应该为异常处理指定一些条件
try
{
var result = taskThatThrowsException.Result;
}
catch (AggregateException ex) when (ex.InnerException is MyException myException)
{
// use myException - it is your true unwrapped exception
}
但是您不应该阻止异步代码-您应该异步等待-使用等待
,您也会得到真正的未包装异常:
var result = await taskThatThrowsException;
当在任务中抛出异常时,使用
Result
属性,您将获得aggregateeexception
,其中真正的异常位于该aggregateeexception
对象的InnerException
属性中(您的异常由aggregateeexception
包装)
要获取真正的异常(未包装异常),可以使用GetAwaiter().GetResult()
:
您也可以使用Result
属性,但是您应该为异常处理指定一些条件
try
{
var result = taskThatThrowsException.Result;
}
catch (AggregateException ex) when (ex.InnerException is MyException myException)
{
// use myException - it is your true unwrapped exception
}
但是您不应该阻止异步代码-您应该异步等待-使用等待
,您也会得到真正的未包装异常:
var result = await taskThatThrowsException;
我认为这是由于
继续等待
造成的。只需将该代码移到等待
之外和之后。混合等待
和继续等待
是一件奇怪的事情,在等待
之后的所有事情都是继续。这也可能是由于调用结果
,因为您不再依赖异步状态机来打开异常我认为这是由于继续等待
造成的。只需将该代码移到等待
之外和之后。混合等待
和继续等待
是一件奇怪的事情,在等待
之后的一切都是继续。这也可能是由于调用结果t
因为您不再依赖异步状态机来打开异常