Я вызываю веб-службу асинхронно с использованием HttpClient и обрабатываю ответ с помощью ContinueWith
. В этом случае я хочу проверить HttpStatusCode
и выбросить исключение, если это не 200 (успех).Выбросить исключение в пределах ContinueWith block
Мой код выглядит следующим образом:
// 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
.
Есть ли способ заставить задачу выбросить исключение, которое я изначально хотел, или мне нужно поставить try/catch вокруг метода Wait()
и вытащить мой тип исключения?
* Я асинхронно звоню в веб-службу *. Нет, вы используете 'task.Wait()', вы * синхронно блокируете *. Любая причина, по которой вы не используете async-wait? –
Исключение AggregateException будет содержать любые исключения, занесенные в его свойство InnerExceptions – stuartd
Хотя это не отвечает на ваш вопрос, есть одна драматическая вещь об этом коде - метод 'ValidateResponse'. Это утверждение 'switch' ужасно - читайте о фабриках, это шаблон, используемый для обработки подобных ситуаций. –