0
私はHttpClientを使用して非同期にWebサービスを呼び出し、ContinueWith
を使用して応答を処理しています。この中で、私はHttpStatusCode
をチェックし、200でなければ例外をスローしたい(成功)。次のようにContinueWithブロック内で例外をスローする
私のコードは次のとおりです。ただし
// Call the GetAddress service passing in the postcode
var task = client.GetAsync(url)
.ContinueWith((taskWithResponse) =>
{
var response = taskWithResponse.Result;
ValidateResponse(response.StatusCode);
var jsonString = response.Content.ReadAsStringAsync();
jsonString.Wait();
model = JsonConvert.DeserializeObject<GetAddressResults>(jsonString.Result);
});
task.Wait();
private static void ValidateResponse(HttpStatusCode statusCode)
{
Exception exception = null;
switch(statusCode)
{
case HttpStatusCode.NotFound:
exception = new NotFoundException();
break;
case HttpStatusCode.BadRequest:
exception = new InvalidException();
break;
case HttpStatusCode.Forbidden:
exception = new ForbiddenException();
break;
case (System.Net.HttpStatusCode)429:
exception = new ExceededLimitException();
break;
default:
return;
}
throw exception;
}
これを実行する代わりに、私はそれが代わりに投げtask.Wait()
とAggregateException
でキャッチだ指定した例外のいずれかを返すとき。
私が最初に望んでいた例外をスローするタスクを取得する方法がありますか、またはWait()
メソッドのtry/catchを入れて例外タイプを取り出す必要がありますか?
*私は非同期にWebサービスを呼び出しています*。いいえ、あなたは 'task.Wait()'を使っています、あなたは*同期的にブロックしています*。非同期を使用していない理由は何ですか? –
AggregateExceptionにはInnerExceptionsプロパティにスローされた例外が含まれます – stuartd
あなたの質問には答えませんが、このコードについては劇的なものがあります。これは 'ValidateResponse'メソッドです。この 'switch'ステートメントは、工場についてのひどい読みです。この種の状況を扱うためのパターンです。 –