测试Exponential Backoff函数仅触发一次重试,求问题排查
问题排查与修复方案
嘿,我一眼就瞅到问题所在啦——你的指数退避函数有两个关键小错误,导致它只重试一次就终止了:
1. 把比较写成了赋值(致命错误)
在catch块里的这句if (tries = maxTries)是赋值操作,不是你想要的相等比较!它会直接把maxTries的值(默认是5)赋给tries,导致这个条件永远为true,第一次捕获错误后就立刻抛出异常,循环直接终止,自然只会试一次。
正确的写法应该是用严格相等运算符===,而且还要注意循环的索引逻辑:因为循环是从tries=0开始,到tries < maxTries结束,所以最后一次尝试的索引是maxTries - 1——只有当这次尝试也失败时,才应该抛出最终的异常。
2. 可选优化:尝试计数更直观
当前日志里的Try number ${tries}会从0开始计数,改成${tries + 1}会更符合咱们日常的“第1次、第2次”的直觉,这个是小优化,不影响功能,但能提升日志可读性。
修复后的完整函数
function tryAgain(action, maxTries = 5) { for (let tries = 0; tries < maxTries; tries++) { Logger.log(`Try number ${tries + 1}`); try { return action(); // 只要成功就直接返回结果,没问题 } catch (e) { Logger.log(`Error caught; trying again: ${e}`); // 只有最后一次尝试失败时,才抛出异常 if (tries === maxTries - 1) { throw e; } } // 非最后一次失败,执行指数退避休眠 Utilities.sleep(2 ** tries * 1000); } }
测试效果验证
用你的测试函数调用修复后的tryAgain,现在会执行最多5次尝试(包括第一次),每次失败后依次等待1s、2s、4s、8s的指数退避时间,最后一次失败才会抛出异常。
日志输出大概是这样的:
Try number 1 test Error caught; trying again: error msg Try number 2 test Error caught; trying again: error msg Try number 3 test Error caught; trying again: error msg Try number 4 test Error caught; trying again: error msg Try number 5 test Error caught; trying again: error msg // 最终抛出异常
这样就完全符合指数退避的预期逻辑啦!
内容的提问来源于stack exchange,提问作者Joshua Pelton-Stroud
相关产品推荐
相关产品推荐

