c# - 使用错误处理处理多个 http 请求异步的正确方法
问题描述
该解决方案有效,但有没有更好的方法来处理像这样的多个请求的错误处理。
下面的代码描述了我想要做什么,并且绝对有效。但我确信有更好的方法来解决这个问题?我也尝试了其他选项,但由于某些请求将返回 404 失败。
public async Task<List<Bruker>> TryGetContactsByContactIds(List<AZContact> contacts)
{
var tasks = contacts.Select(c => TryGetContactAsync(c.Email)).Where(c => c.Result != null);
try
{
var tasksresult = await Task.WhenAll(tasks);
return tasksresult.ToList();
}
catch (Exception e)
{
_logger.Error("unable to fetch all", e);
}
return new List<Bruker>();
}
public async Task<Bruker> TryGetContactAsync(string userId)
{
try
{
var user = await _brukereClient.GetAsync(userId);
return user;
}
catch (SwaggerException e)
{
if (e.StatusCode == 404)
{
_logger.Info($"user with Id {userId} does not exist");
}
else
{
_logger.Error("Unable to fetch user", e);
}
}
return null;
}
解决方案
您可能正在处理 的功能/限制await
,它仅引发等待任务(WhenAll
本例中的任务)的聚合异常之一。您必须枚举所有任务来处理每个单独的异常。
try
{
var tasksresult = await Task.WhenAll(tasks);
return tasksresult.ToList();
}
catch (Exception e)
{
foreach (var task in tasks)
{
if (task.IsFaulted)
{
var taskException = task.Exception.InnerException;
// ^^ Assuming that each task cannot have more than one exception inside its AggregateException.
if (taskException is SwaggerException swaggerException)
{
if (swaggerException.StatusCode == 404)
{
_logger.Info($"user with Id {userId} does not exist");
}
else
{
_logger.Error("Unable to fetch user", swaggerException);
}
}
else
{
_logger.Error("An unexpected task error occurred", taskException);
}
}
}
if (!tasks.Any(t => t.IsFaulted))
{
_logger.Error("A non task-related error occurred", e);
}
}
推荐阅读
- r - 使 conditionalPanel 与 R 闪亮 Golem 包中的输入参数一起工作
- unity3d - 如果使用 UnityWebRequest,如何使用 WriteAllBytes?
- batch-file - 这个时候出乎意料。错误级别纠正并继续
- react-native - React-native-reanimated 2:如何更新 Text 以响应 PanGestureHandler?
- angular - Angular:列表/表单模块
- woocommerce - 取消订阅取消/过期的所有用户订单
- html - 如何显示来自用户输入的超链接?
- reactjs - 从 API ReactJs 获取数组数组
- angular - 如何仅获取ngrx选择器中更改的值?
- matlab - 如何添加先前请求的时间函数作为 ODE 45 中的输入?[MATLAB]