Xamarin.Android中VPN失效时Flurl Http调用出现未处理异常
解决Flurl在VPN断开时的未处理异常及获取响应StatusCode的方案
一、处理VPN断开时的未处理异常
从你给出的异常栈来看,VPN断开后请求无法抵达目标服务器,最终触发了被FlurlHttpException包裹的TaskCanceledException。要避免未处理异常崩溃,你需要给Flurl请求添加针对性的异常捕获逻辑,同时可以合理设置超时时间来快速感知连接问题:
- 针对性捕获异常
直接捕获FlurlHttpException,判断内部异常是否为TaskCanceledException,就能精准处理VPN断开这类连接失败场景:
try { var result = await "http://192.168.110.60/TestServices/MyCall.aspx" .SetQueryParams(new { method = "Test", username = "abc", password = "abc" }) .WithTimeout(10) // 设置10秒超时,避免长时间等待无响应 .ReceiveString(); } catch (FlurlHttpException ex) { if (ex.InnerException is TaskCanceledException) { // 这里处理VPN断开/网络无法连接的情况,比如提示用户检查网络状态 Console.WriteLine("网络连接异常,请检查VPN是否正常开启"); } else { // 处理其他Flurl相关异常,比如HTTP 4xx/5xx错误 Console.WriteLine($"请求出错:{ex.Message}"); } } catch (Exception ex) { // 兜底捕获其他非Flurl类异常 Console.WriteLine($"未知错误:{ex.Message}"); }
- 全局异常处理(可选)
如果应用内有大量Flurl请求,你可以注册全局错误处理逻辑,避免每个请求都重复写捕获代码:
FlurlHttp.Configure(settings => { settings.OnErrorAsync = call => { if (call.Exception.InnerException is TaskCanceledException) { // 全局统一处理连接超时/断开的情况 Console.WriteLine("全局提示:当前网络连接异常,请检查VPN"); } return Task.CompletedTask; }; });
二、获取响应的StatusCode
不管请求成功还是失败(服务器有返回的情况下),你都能通过Flurl拿到响应的StatusCode:
- 请求成功时获取
先调用.GetAsync()拿到HttpResponseMessage,再读取StatusCode:
var response = await "http://192.168.110.60/TestServices/MyCall.aspx" .SetQueryParams(new { method = "Test", username = "abc", password = "abc" }) .GetAsync(); int statusCode = (int)response.StatusCode; // 成功时会拿到200 var result = await response.ReceiveString();
- 请求失败时从异常中获取
当请求抛出FlurlHttpException时,异常的Response属性包含服务器返回的响应信息(如果请求抵达了服务器):
catch (FlurlHttpException ex) { if (ex.Response != null) { int statusCode = (int)ex.Response.StatusCode; Console.WriteLine($"请求返回错误码:{statusCode}"); } // 其他异常处理逻辑... }
注意:如果是VPN断开导致请求完全无法抵达服务器,ex.Response会是null,这种情况下没有StatusCode可以获取。
内容的提问来源于stack exchange,提问作者Faiz Anwar
相关产品推荐
相关产品推荐

