web-dev-qa-db-ja.com

HttpClient-集約例外の処理

こんにちは私はこれに似たHttpClientを使用しています:

public static Task<string> AsyncStringRequest(string url, string contentType)
{
    try
    {
        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));

        return client.GetStringAsync(url).ContinueWith(task => {
            return task.Result;
        });
    }
    catch (AggregateException ex)
    {
        throw ex;
    }
    catch (WebException ex)
    {
        throw ex;
    }       
    catch (Exception ex)
    {
        throw ex;
    }
}

しかし、私は例外に対処するのに苦労しています。ステップスローを試みるためだけにキャッチブロックを追加しましたが、どのキャッチブロックにもブレークポイントがありません。 Taskを使用すると、呼び出し元とは異なるスレッドで例外が発生する可能性があるため、例外は集約コンテナーにラップされますが、これらの例外を処理する最善の方法がわかりません。

たとえば、Webサービスにリクエストを送信し、リクエストに無効なパラメータを指定すると、例外がスローされます。集約された例外をキャッチし、innerexceptionsを調べて、要求が失敗した理由を突き止め、わかりやすいメッセージを返すことができるようにしたいと思います。

だから私の質問は、これらの集約された例外をキャッチしてそれらに対処するための最良の方法は何ですか?

12
gdp

例外は task.Result によってスローされます:

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url).ContinueWith(task =>
{
    try
    {
        return task.Result;
    }
    catch (AggregateException ex)
    {
        throw ex;
    }
    catch (WebException ex)
    {
        throw ex;
    }       
    catch (Exception ex)
    {
        throw ex;
    }
});

より良い:アクセスする前にタスク faulted かどうかを確認してください task.Result

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url).ContinueWith(task =>
{
    if (task.IsFaulted)
    {
        var ex = task.Exception;
    }
    else if (task.IsCancelled)
    {
    }
    else
    {
        return task.Result;
    }
});

ContinueWith で実際に何かをしていない場合は、単純に省略できます。

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url);
19
dtb