2016-09-12 14 views
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を入れて例外タイプを取り出す必要がありますか?

+4

*私は非同期にWebサービスを呼び出しています*。いいえ、あなたは 'task.Wait()'を使っています、あなたは*同期的にブロックしています*。非同期を使用していない理由は何ですか? –

+2

AggregateExceptionにはInnerExceptionsプロパティにスローされた例外が含まれます – stuartd

+0

あなたの質問には答えませんが、このコードについては劇的なものがあります。これは 'ValidateResponse'メソッドです。この 'switch'ステートメントは、工場についてのひどい読みです。この種の状況を扱うためのパターンです。 –

答えて

2

と同時にというWebサービスを呼び出しています。あなただけのAggregateExceptionをキャッチし、それがInnerExceptions財産です確認し、これらのキーワード(たぶん2010 Visual Studioで)を使用することができない場合は

try 
{ 
    var response = await client.GetAsync(url); 
    ValidateResponse(response.StatusCode); 
    var jsonString = await response.Content.ReadAsStringAsync(); 
    model = JsonConvert.DeserializeObject<GetAddressResults>(jsonString); 
} 
catch (NotFoundException e) 
{ 
    // ... 
} 
catch (ForbiddenException e) 
{ 
    // ... 
} 
... 

:代わりにawait/asyncキーワードを使用します。

関連する問題