Я считаю, что интересно обрабатывать все ошибки HTTP как исключения. Не уверен, что это лучшая практика, но я попробовал.
То, что я сделал что-то вроде этого:
public static async Task<User> LoginWithEmail (string email, string password){
try{
return await "http://myapi.com/login"
.AppendPathSegment ("login")
.SetQueryParams (new {email = email, password = password})
.WithHeader ("Accept", "application/json")
.GetJsonAsync<User>();
}catch (FlurlHttpException e) {
return await e.Call.Response.Content.ReadAsStringAsync()
.ContinueWith<User> ((contentAsync) => {
throw new MyApiException(JsonConvert.DeserializeObject<MyApiError> (contentAsync.Result)); });
}
}
Это позволяет обрабатывать случаи успеха и ошибки, как это:
async void FakeLogin()
{
try{
User user = await LoginWithEmail ("[email protected]", "fakePassword");
}
catch(MyApiException e) {
MyApiError = e.Error;
}
}
В принципе
Для случая FlurlHttpException , Я делаю продолжение для ReadAsStringAsync, где объявляю продолжение возвращать пользователя, но внутри продолжения я всегда выбросить исключение.
Кроме того
Вы можете реорганизовать обработку исключения быть как:
catch (FlurlHttpException e) {
return await MyApiException.FromFlurlException<User>(e);
}
Я думаю, что мой [новый ответ] (http://stackoverflow.com/a/28332184/62600) должен быть тем, что вы ищете. –