簡體   English   中英

正確處理多種HTTP請求異步的錯誤處理方法

[英]Correct way to handle mulitple http Request async with error handling

該解決方案有效,但是有一種更好的方式通過錯誤處理來處理多個請求。

下面的代碼描述了我想要做的,並且絕對有效。 但是我敢肯定有更好的方法來解決這個問題? 我也嘗試了其他選項,但是由於某些請求將返回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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM