Я хочу выдать свое собственное исключение, если я получу код состояния 403
Есть 2 способа сделать это. Во-первых, просто отбросить блок захвата (здесь удобно использовать catch
/ when
):
try
{
...
}
catch (FlurlHttpException ex) when (ex.Call.HttpStatus == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
Второй способ - предотвратить бросок Flurl, используя AllowHttpStatus
:
var resp = await "https://myapi.com/rest/age?apikey=XXXXXXXX"
.AllowHttpStatus("4xx")
.PostJsonAsync(apirequest);
if (resp.StatusCode == HttpStatusCode.Forbidden)
{
throw new MyException(...);
}
Одно предостережение со вторым подходом состоит в том, что у вас остается «необработанный» HttpResponseMessage
, который вам нужно будет десериализовать самостоятельно, так как ReceiveJson
Флурла связывает с Task<HttpResponseMessage>
, и вы уже ждали, что Task
. Но десериализовать его самостоятельно не так уж сложно , есть запланированное улучшение , которое решит эту проблему в ближайшем будущем, или вы всегда можете использовать этот хакерский обходной прием:
await Task.FromResult(resp).ReceiveJson<myResponse>();
Честно говоря, я бы, наверное, пошел с первым подходом. FlurlHttpException
имеет несколько удобных методов, таких как GetResponseJsonAsync<T>
, которые позволяют десериализовать тело ошибки, если это JSON, или GetResponseStringAsync
, если вам просто нужна необработанная строка.