我相信将所有 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 ("fakeEmail@me.com", "fakePassword");
}
catch(MyApiException e) {
MyApiError = e.Error;
}
}
基本上
对于 FlurlHttpException 情况,我对 ReadAsStringAsync 进行了延续,我在其中声明延续以返回用户,但在延续中我总是抛出异常。
此外
您可以将异常处理重构为短如:
catch (FlurlHttpException e) {
return await MyApiException.FromFlurlException<User>(e);
}