项目

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 请求的函数(如 GetJsonAsyncPostJsonAsync)在 HTTP 调用失败时也会抛出异常。

在本文档中