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
可能引发连接错误。因此,感谢您提出的问题和解决方案,非常有帮助。