You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RestSharp与System.Text.Json时如何捕获错误?

解决RestSharp+System.Text.Json反序列化无异常、无法获取响应状态码问题

1. 配置System.Text.Json反序列化失败抛出异常

System.Text.Json默认反序列化出错时不会抛出异常,而是返回null,需通过JsonSerializerOptions开启异常抛出:

var jsonOptions = new JsonSerializerOptions {
    PropertyNameCaseInsensitive = true, // 适配接口返回字段的大小写差异(可选)
    ThrowOnDeserializationErrors = true, // 核心配置:反序列化失败时抛出异常
    AllowTrailingCommas = true, // 允许响应末尾存在逗号(可选)
    // 若需要对未知字段抛出异常,可添加:
    // UnknownTypeHandling = JsonUnknownTypeHandling.ThrowException
};

2. 在RestSharp中应用自定义序列化配置

初始化RestClient时,指定使用带有自定义配置的System.Text.Json序列化器:

var client = new RestClient("你的接口基础地址", configureSerialization: s => {
    s.UseSystemTextJson(jsonOptions);
});

配置完成后,反序列化失败时会抛出JsonException,用try-catch包裹调用即可捕获错误:

try {
    var request = new RestRequest("address/update").AddJsonBody(updatedAddress);
    var response = await client.PostAsync<AddressUpdateResponse>(request);
    // 处理正常响应
} catch (JsonException ex) {
    // 处理反序列化异常
    Console.WriteLine($"反序列化错误:{ex.Message}");
} catch (HttpRequestException ex) {
    // 处理HTTP请求层面的异常
    Console.WriteLine($"请求错误:{ex.Message}");
}

3. 获取完整响应信息(含HTTP状态码)

若需在任何情况下都获取HTTP状态码、响应内容等细节,建议使用非泛型的PostAsync方法,手动处理反序列化:

var request = new RestRequest("address/update").AddJsonBody(updatedAddress);
var fullResponse = await client.PostAsync(request);

// 先检查HTTP请求是否成功
if (!fullResponse.IsSuccessful) {
    Console.WriteLine($"HTTP状态码:{fullResponse.StatusCode},响应内容:{fullResponse.Content}");
    return;
}

// 手动执行反序列化
try {
    var responseModel = JsonSerializer.Deserialize<AddressUpdateResponse>(fullResponse.Content, jsonOptions);
    // 处理业务逻辑
} catch (JsonException ex) {
    Console.WriteLine($"反序列化失败:{ex.Message}");
}

内容的提问来源于stack exchange,提问作者chobo2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:22:07