网络断开时外部API调用失败的异常处理求助
网络断开时API调用异常的修复方案
现有代码的问题
- 使用了过时的
WebException:在.NET Core/.NET 5+环境下,HttpClient相关方法抛出的是HttpRequestException(网络中断、请求失败时触发),部分场景还会抛出TaskCanceledException(比如超时或网络断开导致请求取消),WebException不再适用。 - catch块无处理逻辑:空catch会掩盖异常,但后续代码直接访问
rootdata.d.Results,此时rootdata未被赋值,会触发空引用异常,这就是浏览器控制台报错的根源。 - 未处理请求成功但返回数据为空的情况:即使请求成功,
rootdata或rootdata.d也可能为空,直接调用ToList()会再次引发异常。
修复后的代码
private async Task<IEnumerable<Result>> searchresult(string searchText) { try { rootdata = await HttpClientJsonExtensions.GetFromJsonAsync<Rootdata>(httpClient, $"https://expressentry..."); // 检查返回数据是否为空,避免空引用 if (rootdata?.d?.Results == null) { return Enumerable.Empty<Result>(); } addresslist = rootdata.d.Results.ToList(); return addresslist; } // 捕获网络相关异常(网络断开、请求失败等) catch (HttpRequestException ex) { // 可在此记录日志,或返回空列表/友好提示 return Enumerable.Empty<Result>(); } // 捕获请求超时或被取消的异常(部分网络断开场景会触发) catch (TaskCanceledException ex) { // 可在此记录日志 return Enumerable.Empty<Result>(); } // 捕获JSON序列化失败的异常(可选) catch (JsonException ex) { // 可在此记录日志 return Enumerable.Empty<Result>(); } }
关键说明
- 异常类型替换:用
HttpRequestException和TaskCanceledException覆盖网络相关的失败场景,确保能捕获网络断开时的错误。 - 空值检查:在访问
rootdata.d.Results前增加空值判断,避免空引用异常。 - 异常处理逻辑:catch块中不再空处理,而是返回空列表(或根据业务需求抛出友好异常),保证方法能正常返回,不会导致前端未处理错误。
内容的提问来源于stack exchange,提问作者Ramesh p
相关产品推荐
相关产品推荐

