2012-06-28 13 views
11

こんにちは私はHttpClientをこれに類似を使用しています。私は追加のキャッチブロックを試してスローするだけで追加しましたが、いずれのキャッチブロックにもブレークポイントはありません。私はタスクを使用して例外が呼び出し元とは異なるスレッド上で発生する可能性がありますので、例外は集約コンテナにラップされますが、私はこれらの例外を処理する最良の方法は何か分かりません。のHttpClientを集約例外を扱う

たとえば、Webサービスにリクエストを行い、リクエスト内の無効なパラメータを特定し、例外がスローされます。私は集計例外をキャッチして、なぜ要求が失敗したのか、そしてフレンドリーなメッセージを返すための知識を調べることができます。

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

答えて

18

例外が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にアクセスする前に、タスクfaultedかどうかを確認:

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で何かをやっていない場合は、することができます単に省略してください:

+0

素晴らしいよ、次の時間に試してみるよ! – gdp

+9

これは古い質問ですが、WebExceptionをキャッチするときのように、aggregateexceptionからhttpステータスコードを取得する方法はありますか? – gdp

+0

@gdp:はい、AggregateExceptionで.Flattenを呼び出してからInnerExceptionsプロパティにアクセスし、その内部に含まれるWebExceptionを引き出すことができます。 –

関連する問題