我有一些外部提供的回调要运行。由于它们可以包含任何内容,我更愿意冒险捕获Throwable
,因此可以从可恢复的任何错误中恢复。
除非错误连续重复两次,否则允许回调执行的某些阶段抛出错误。在这种情况下,它们被标记为无效,除非用户手动启动它们,否则它们将无法再运行。
这是处理该问题的方法:
/**
* Sets whether the bot is disabled due to error or not. If error has occured during
* getWindow, the bot will be disabled immediatelly. If the error occured during canRun() or run()
* the bot will only be disabled if the error is repetitive.
* @param error error that occured
* @param phase phase of execution in which the error occured
* @return true if this error is not significant enough to cancel this bot
*/
public boolean continueOnError(Throwable error, ExecutionPhase phase) {
System.err.println("Error "+error+" caught in robot "+this.getClass().getName());
System.err.println("Last: "+lastError+((error.equals(lastError)?" which is the same as last":" which is defferent than last")));
if(phase == ExecutionPhase.GET_WINDOW || (error.equals(lastError) && phase==errorPhase)) {
//Remember last
setLastError(error, phase);
//If robot state listener is listening, inform it about this event
if(listener!=null)
listener.disabledByError(error);
//Disable the robot - on attempt to run, it will throw RobotDisabledException
return !(errorDisabled = true);
}
//Rememeber last
setLastError(error, phase);
//The robot can remain running, but next same error will turn it down
return true;
}
我知道这是一种原始方法,但我需要从某个地方开始。此代码的问题是equals
上的Throwable
方法总是返回false。请参阅此方法生成的输出:
Error java.lang.Error: TEST ERROR caught in robot cz.autoclient.robots.LaunchBot
Last: java.lang.Error: TEST ERROR which is defferent than last
Error java.lang.Error: TEST ERROR caught in robot cz.autoclient.robots.LaunchBot
Last: java.lang.Error: TEST ERROR which is defferent than last
Error java.lang.Error: TEST ERROR caught in robot cz.autoclient.robots.LaunchBot
Last: java.lang.Error: TEST ERROR which is defferent than last
Error java.lang.Error: TEST ERROR caught in robot cz.autoclient.robots.LaunchBot
Last: java.lang.Error: TEST ERROR which is defferent than last
为什么会这样?
答案 0 :(得分:7)
Throwable
不会覆盖Object
的{{1}},因此equals
的行为与error.equals(lastError)
相同。
或许比较这些类就足够了:
error == lastError
答案 1 :(得分:2)
Throwable
没有覆盖 equals()
,存在问题您的Error
和LastError
实例可能是2个不同Throwable
1}}具有相同值的实例
答案 2 :(得分:2)
equals()
不起作用,因为它仅比较实例。如果两次抛出“相同”异常,则会为您提供两个实例,Object.equals()
将返回false。
在Java中没有完美的方法来检查两个异常是否相同(例如,它们可能包含时间戳)。
更好的方法可能是记住导致问题的组件,并在它开始抛出太多错误时禁用它(无论是哪个错误或重复这些错误)。
同样Throwable
也会捕获您可能不想要的不可恢复的Error
。代码应该适用于Exception
,甚至可能适用于RuntimeException
,具体取决于您的设计的工作方式。