RestSharp 错误处理
如果网络传输出现错误(例如网络断开、DNS 解析失败等),或者服务器返回任何类型的错误(除了 404),RestResponse.ResponseStatus
将设置为 ResponseStatus.Error
。否则,它将为 ResponseStatus.Completed
。
如果 API 返回 404,ResponseStatus
仍然为 Completed
。如果您需要访问返回的 HTTP 状态码,请查看 RestResponse.StatusCode
。
Status
属性是独立于 API 错误处理的完成指示器。
通常情况下,RestSharp 在请求失败时不会抛出异常。
但是,您可以配置 RestSharp 在正常情况下不抛出异常,而是将其作为属性提供错误信息。
属性名 | 行为 |
---|---|
FailOnDeserializationError |
当失败的序列化导致响应的 Data 属性为空时,改变默认行为。将此属性设置为 true 将使 RestSharp 将序列化失败视为错误,并相应地将 ResponseStatus 设置为 Error 。 |
ThrowOnDeserializationError |
当失败的序列化导致响应的 Data 属性为空时,改变默认行为。将此属性设置为 true 将使 RestSharp 在序列化失败时抛出异常。 |
ThrowOnAnyError |
将此属性设置为 true 改变默认行为,当执行请求或序列化过程中发生任何错误时,强制 RestSharp 抛出异常。 |
这些属性适用于 RestClientOptions
,并将应用于使用该客户端实例的所有请求。
例如,您可以配置客户端,使其在请求失败或请求返回非成功 HTTP 状态码时抛出异常:
var options = new RestClientOptions(url) {
ThrowOnAnyError = true
};
var client = new RestClient(options);
var request = new RestRequest("resource/{id}").AddUrlSegment("id", 123);
// 👇 如果请求失败,`response` 将抛出异常
var response = await client.ExecuteGetAsync<ResponseModel>(request);
请注意,只有当序列化器在尝试序列化响应时抛出异常时,序列化失败才会起作用。许多序列化器默认不会抛出异常,而是返回
null
结果。RestSharp 无法确定为何返回 null
,因此在这种情况下不会失败。请检查序列化器文档以了解如何配置其在序列化错误时抛出异常。
不同重载处理异常的方式也略有不同。
异步泛型方法(如 GetAsync<T>
、PostAsync<T>
等)不属于 RestClient
接口(这些方法是扩展方法),它们返回 Task<T>
。这意味着没有 RestResponse
可以设置响应状态为错误。我们决定在这样的请求失败时抛出异常。这是在 API 一致性与库可用性之间做出的权衡。通常,您只需要 RestResponse
实例的内容来诊断问题,大多数情况下异常会告诉您问题所在。
下面列出了不同扩展方法如何处理错误。请注意,默认不抛出异常的函数在 ThrowOnAnyError
设置为 true
时也会抛出异常。
函数 | 在错误时抛出异常 |
---|---|
ExecuteAsync |
否 |
ExecuteGetAsync |
否 |
ExecuteGetAsync<T> |
否 |
ExecutePostAsync |
否 |
ExecutePostAsync<T> |
否 |
ExecutePutAsync |
否 |
ExecutePutAsync<T> |
否 |
GetAsync |
是 |
GetAsync<T> |
是 |
PostAsync |
是 |
PostAsync<T> |
是 |
PatchAsync |
是 |
PatchAsync<T> |
是 |
DeleteAsync |
是 |
DeleteAsync<T> |
是 |
OptionsAsync |
是 |
OptionsAsync<T> |
是 |
HeadAsync |
是 |
HeadAsync<T> |
是 |
此外,所有针对 JSON 请求的函数(如 GetJsonAsync
和 PostJsonAsync
)在 HTTP 调用失败时也会抛出异常。