Polly重试模式:onRetry块中response是否可能为空的咨询
onRetry块中的response.Result是否可能为空?
你的代码里,onRetry的参数response是DelegateResult<HttpResponseMessage>类型,它本身不会为空,但**response.Result确实有可能为空**,分两种触发重试的场景具体分析:
当重试由
HttpRequestException触发时:
此时response.Exception会持有该异常实例,而response.Result会是null(因为HttpResponseMessage是引用类型,默认值为null)。这种情况下直接访问response.Result或response.Result.StatusCode,必然会抛出NullReferenceException。当重试由
OrResult条件触发时:
你的OrResult条件明确限制了r != null && !r.IsSuccessStatusCode,所以这种场景下response.Result一定是非空的,访问它的属性不会有问题。
因此你的代码存在空引用风险,修复时可以在访问response.Result前先做非空判断,或者区分异常与结果两种重试场景:
onRetry: (response, delay, retryCount, context) => { Console.WriteLine(retryCount); if (response.Result != null) { Console.WriteLine(response.Result); Console.WriteLine(response.Result.StatusCode); } else if (response.Exception != null) { Console.WriteLine($"重试原因:{response.Exception.Message}"); } }
内容的提问来源于stack exchange,提问作者user18024637
相关产品推荐
相关产品推荐

