Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从任务中抛出/捕获内部异常?_C#_Winforms - Fatal编程技术网

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
因为您不再依赖异步状态机来打开异常