Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# httpclient.GetStringAsync(url)异步api调用的异常处理_C#_Exception Handling_Async Await_Httpclient - Fatal编程技术网

C# httpclient.GetStringAsync(url)异步api调用的异常处理

C# httpclient.GetStringAsync(url)异步api调用的异常处理,c#,exception-handling,async-await,httpclient,C#,Exception Handling,Async Await,Httpclient,如果您有以下方法: public async Task<string> GetTAsync(url) { return await httpClient.GetStringAsync(url); } public async Task<List<string>> Get(){ var task1 = GetTAsync(url1); var task2 = GetTAsync(url2); await Task.WhenAll(n

如果您有以下方法:

public async Task<string> GetTAsync(url)
{
    return await httpClient.GetStringAsync(url); 
}

public async Task<List<string>> Get(){
   var task1 = GetTAsync(url1);
   var task2 = GetTAsync(url2);
   await Task.WhenAll(new Task[]{task1, task2}); 
   // but this may through if any  of the   tasks fail.
   //process both result
}
公共异步任务getAsync(url) { 返回wait-httpClient.GetStringAsync(url); } 公共异步任务Get(){ var task1=GetTAsync(url1); var task2=GetTAsync(url2); wait Task.WhenAll(新任务[]{task1,task2}); //但如果其中任何一项任务失败,这可能会失败。 //处理这两个结果 } 如何处理异常?我查看了HttpClient.GetStringAsync(url)方法的文档,它可能引发的唯一异常似乎是ArgumentNullException。但至少有一次我遇到了禁止的错误,我想处理所有可能的异常。但我找不到任何特殊的例外。我应该在这里捕捉异常吗?如果能更具体一点,我将不胜感激。
请帮帮我,这真的很重要。

最后我想了一下:

public async Task<List<string>> Get()
{
   var task1 = GetTAsync(url1);
   var task2 = GetTAsync(url2);
   var tasks = new List<Task>{task1, task2};
   //instead of calling Task.WhenAll and wait until all of them finishes 
   //and which messes me up when one of them throws, i got the following code 
   //to process each as they complete and handle their exception (if they throw too)
   foreach(var task in tasks)
   {
      try{
       var result = await task; //this may throw so wrapping it in try catch block
       //use result here
      }
      catch(Exception e) // I would appreciate if i get more specific exception but, 
                         // even HttpRequestException as some indicates couldn't seem 
                         // working so i am using more generic exception instead. 
      {
        //deal with it 
      }
   } 
}
公共异步任务Get() { var task1=GetTAsync(url1); var task2=GetTAsync(url2); var tasks=新列表{task1,task2}; //而不是调用Task.whalll并等待所有任务完成 //当他们中的一个抛出时,我得到了下面的代码 //在它们完成时处理每个异常并处理它们的异常(如果它们也抛出异常) foreach(任务中的var任务) { 试一试{ var result=await task;//这可能引发错误,因此将其包装到try-catch块中 //在这里使用结果 } catch(Exception e)//如果我得到更具体的异常,我将不胜感激,但是, //甚至一些人指出的HttpRequestException看起来也不可能 //正在工作,因此我使用更通用的异常。 { //处理它 } } } 这是我最后想到的一个更好的解决方案。如果有更好的,我很想听听。
我在这里发布这篇文章,以防其他人遇到同样的问题

捕获
异常
,然后检查它是否属于
聚合异常
类型。如果是这样,
aggregateeexception.InnerExceptions
允许您访问单个任务可能引发的异常。注意
AggregateException
可以嵌套,您可以使用
AggregateException.flatte
来说明这一点。或者,在
等待任务之后。当所有
都可以访问单个任务的
任务。结果
或执行
等待任务
时,它将重新抛出任务的异常。相关:。是的,我可以捕获聚合异常并将其展平到,但我需要的是httpclient.GetStringAsync()方法可能引发的特定异常。在查看其他帖子时,有人写道HttpRequestException是将抛出的异常。到目前为止我还不能证实这一点。你为什么不自己试试呢?您将获得带有相关错误信息的
System.Net.Http.HttpRequestException
,例如,“响应状态代码不表示成功:404(未找到)。”请记住,类似
404
的状态将为
HttpClient.GetStringAsync
抛出错误,但不是针对
HttpClient.GetAsync
。我尝试了,但没有得到HttpRequestException或Aggregate异常。但我还是得了残疾。我不知道当您收到404或403错误时,这是否是预期的结果。当我使用无效URL调用
GetStringAsync
时,我会得到
HttpRequestException
。如果没有看到实际的代码调用
GetStringAsync
并访问URL,很难解释为什么会出现
invalidoOperationException
。使用Fiddler监视HTTP数据包。当您说
HttpRequestException
不工作时,您是什么意思?你还观察到了什么例外情况?我能回忆起的另外一个异常是
TaskCanceledException
(这是HttpClient中的一个bug,请参阅)。该线程还暗示
WebException
是一种可能性,所以我想检查一下也不会有什么坏处。这对我来说是有意义的。该选项不表示
等待GetAsync
可能引发连接错误。因此,感谢您提出的问题和解决方案,非常有帮助。