gpt4 book ai didi

java - 在try-catch block 中进行递归调用以重试N次

转载 作者:行者123 更新时间:2023-12-04 18:33:42 27 4
gpt4 key购买 nike

我有一个常规的,非静态的sendMail方法,有时可能会失败。我需要捕获任何错误,然后重试该方法N次。我不确定自己做的正确,而且还会出现编译错误:

public void sendMail(List<String> params) {

try {
//...

static int retrycount = 0; // static not allowed here (but need to keep static var for recursion)
int maxretries = 3;
}
catch (Exception e) {
log.info(e);
// Recursion to retry
sendMail(params);
retrycount++;
}
}


首先,从try / catch块进行递归是否正确?另外,还有更好的方法吗?

我无法将 sendMail方法设为静态,在现有代码中对其的引用过多。

最佳答案

首先,重试永远不会起作用,因为在每个try块中,您都将retrycount设置为0。

您最好抛出异常而不是捕获异常。然后使用某种while循环直到完成,也许在重试之间有可配置的延迟。或者,如果您使用的是Spring,则有Retryable批注。

void someMethod(){
int attempts = 0;
while(attemps <= 3){
try {
sendMail(...);
break;
} catch (Exception e){
attempts++;
// Log failed to send mail or something meaningful, maybe add a delay here?
}
}
}


该解决方案比使用递归要干净得多,因为您要重试很多次,最终会出现堆栈溢出错误。它还使sendMail函数的职责保持简单,并避免将复杂的重试逻辑添加到本来简单的方法中。

同样,如果最终不得不以相同的方式使其他方法可重试,则将重试逻辑抽象为某种处理所有内容的执行程序服务会容易得多。

关于java - 在try-catch block 中进行递归调用以重试N次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59651927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com