使用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
相关产品推荐
相关产品推荐

