12

こんにちは私はこれに似た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を調べて、要求が失敗した理由を突き止め、わかりやすいメッセージを返すことができるようにしたいと思います。

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

4

1 に答える 1

19

例外は次のようにスローされ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;
    }
});

より良い:アクセスする前にタスクが失敗したかどうかを確認してください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);
于 2012-06-28T07:12:08.357 に答える