WebAPI 客户端——处理我自己的异常而不是 AggregateException

WebAPI Client -- handle my own exception rather then AggregateException

我写了一个非常简单的 WebApiClient 扩展 HttpClient。代码如下。这样做的主要原因是当 httpResponse.IsSuccessStatusCode 为假时抛出 MyOwnWebApiException。

 public class WebApiClient : HttpClient
{

    public WebApiClient(string apiBaseUrl)
    {
        this.BaseAddress = new Uri(apiBaseUrl);
        this.DefaultRequestHeaders.Accept.Clear();

    }

    public void AddAcceptHeaders(MediaTypeWithQualityHeaderValue header)
    {
        this.DefaultRequestHeaders.Accept.Add(header);
    }

    public async Task<string> DoPost(string endPoint, Object dataToPost)
    {
        HttpResponseMessage httpResponse = await ((HttpClient)this).PostAsJsonAsync(endPoint, dataToPost);
        if (httpResponse.IsSuccessStatusCode)
        {
            string rawResponse = await httpResponse.Content.ReadAsStringAsync();
            return rawResponse;
        }
        else
        {
            string rawException = await httpResponse.Content.ReadAsStringAsync();
            MyOwnWebApiErrorResponse exception =
             JsonConvert.DeserializeObject<MyOwnApiErrorResponse>(rawException, GetJsonSerializerSettings());

            throw new MyOwnWebApiException (exception.StatusCode,exception.Message,exception.DeveloperMessage,exception.HelpLink);
        }
    }


    #region "Private Methods"

    private static JsonSerializerSettings GetJsonSerializerSettings()
    {
        // Serializer Settings
        var settings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.All,
            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
            ObjectCreationHandling = ObjectCreationHandling.Auto
        };
        return settings;
    }

    #endregion

以下是 class 使用 WebApiClient 的代码。

    class TestWebApiClient
{
    private WebApiClient _client;
    public ComputationProcessesWebApiClient()
    {
        _client = new WebApiClient("http://test.api/");
        _client.AddAcceptHeaders(new MediaTypeWithQualityHeaderValue("application/json"));

    }

    public void GetData(string dataFor)
    {
        try
        {
            DataRequest request = new DataRequest();
            request.dataFor = dataFor;

            **// THIS LINE IS THROWING AGGREGATEEXCEPTION--- **I WANT MyOwnException ****
            string response = _client.DoPost("GetData", request).Result;   // Use the End Point here ....

        }
        catch (MyOwnWebApiException exception)
        {
            //Handle exception here
         }
    }

}

问题 在 TestWebApiClient class 中,我不想捕获 AggregateException,而是想让它更优雅并捕获 MyOwnWebApiException,但问题是行 ** _client.DoPost("GetData", request)如果 WebApi 出现问题,.Result** 将抛出 AggregateException。如何更改代码以便从 TestWebApiClient 我只需要捕获 MyOwnException ??

这是同步等待您的任务的结果。如果您保持异步并等待您的任务,您会发现您的实际异常是被捕获的异常。

比较以下内容:

void Main()
{
    TryCatch();
    TryCatchAsync();
}
void TryCatch()
{
    try
    {
        ThrowAnError().Wait();
    }
    catch(Exception ex)
    {
        //AggregateException
        Console.WriteLine(ex);
    }
}
async Task TryCatchAsync()
{
    try
    {
        await ThrowAnError();
    }
    catch(Exception ex)
    {
        //MyException
        Console.WriteLine(ex);
    }
}
async Task ThrowAnError()
{
    await Task.Yield();
    throw new MyException();
}
public class MyException:Exception{};

async/await 的最佳提示?一直到 async/await。 .Wait().ResultTask 上的那一刻,事情开始变得混乱。