Try-catch旨在帮助进行异常处理 . 这意味着它将以某种方式帮助我们的系统更加健壮:尝试从意外事件中恢复 .
我们怀疑在执行和指令(发送消息)时可能会发生某些事情,因此它会被包含在try中 . 如果发生几乎意外的事情,我们可以做点什么:我们写下了捕获 . 我认为我们没有打电话来记录异常 . 我认为catch块意味着让我们有机会从错误中恢复 .
现在,假设我们可以从错误中恢复,因为我们可以修复错误 . 重做是非常好的:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
这将很快落入永恒循环,但是假设fix_the_problem返回true,那么我们重试 . 鉴于Java中没有这样的东西,你将如何解决这个问题?解决这个问题的最佳设计代码是什么?
这就像一个哲学问题,因为我已经知道我所要求的并不是Java直接支持的 .
20 回答
虽然
try/catch
是while
是众所周知的好策略我想建议你递归调用:您可以使用jcabi-aspects的AOP和Java注释(我是开发人员):
您还可以使用
@Loggable
和@LogException
注释 .您的确切方案通过Failsafe处理:
很简单 .
大多数答案基本相同 . 我也是,但这是我喜欢的形式
你需要将
try-catch
包含在这样的while
循环中: -我已经采取
count
和maxTries
以避免遇到无限循环,以防异常继续发生在try block
中 .强制性的“企业家”解决方案:
并致电:
像往常一样,最好的设计取决于具体情况 . 通常,我写的东西如下:
使用带有本地
status
标志的while
循环 . 将标志初始化为false
,并在操作成功时将其设置为true
,例如下面:这将继续重试,直到成功 .
如果您只想重试一定次数,那么也要使用计数器:
如果不成功,这将尝试最多10次,直到那时,如果事先成功,将退出 .
解决问题的一种简单方法是将try / catch包装在while循环中并保持计数 . 这样,您可以通过在保持故障日志的同时检查其他变量的计数来防止无限循环 . 它不是最精致的解决方案,但它会起作用 .
如果它有用,还需要考虑几个选项,所有这些选项一起抛出(stopfile而不是重试,sleep,继续更大的循环)都可能有用 .
你可以使用https://github.com/bnsd55/RetryCatch
例:
您可以通过自己的匿名函数代替
new ExampleRunnable()
.所有Try-Catch都可以让您的程序优雅地失败 . 在catch语句中,您通常会尝试记录错误,如果需要,可以回滚更改 .
使用do-while设计重试块 .
我知道这里已经有很多相似的答案,而且我的情况并没有太大的不同,但无论如何我会发布它,因为它涉及一个特定的案例/问题 .
当你在
PHP
中处理facebook Graph API
时,你有时会得到一个错误,但是立即重新尝试同样的事情会给出一个积极的结果(因为各种神奇的互联网原因超出了这个问题的范围) . 在这种情况下,没有必要修复任何错误,但只是再次尝试,因为有某种"facebook error" .创建Facebook会话后立即使用此代码:
此外,通过将
for
循环计数降至零($attempt--
),可以非常轻松地更改将来的尝试次数 .以下是我的解决方案,方法非常简单!
我不确定这是否是“专业”方式,我不完全确定它是否适用于所有事情 .
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
这里是一个可重用且更通用的Java 8方法,不需要外部库:
用法:
剩下的解决方案的问题在于,对应的函数没有时间连续尝试介于两者之间的间隔,因此溢出了堆栈 .
为什么不仅仅是每一秒钟和每一次?
这里使用
setTimeout
和递归函数的解决方案:用你想要每秒重复
try
的函数或代码替换函数Run()
.Spring AOP和基于注释的解决方案:
用法(
@RetryOperation
是我们的工作自定义注释):我们需要做两件事:1 . 注释界面,2 . spring 方面 . 以下是实现这些的一种方法:
注释界面:
Spring 天看点: