在我的Java代码中,我有一个名为getAngle()
的函数,有时会抛出NoAngleException
。以下代码是编写不断调用getAngle()
直到没有引发异常的函数的最佳方法吗?
public int getAngleBlocking()
{
while(true)
{
int angle;
try
{
angle = getAngle();
return angle;
}
catch(NoAngleException e)
{
}
}
}
或者重写错误时返回getAngle()
的更好的主意?
我很惊讶地阅读了该线程的一些答案,因为这种情况恰好是存在检查异常的原因。您可以执行以下操作:
NaN
这是假设与此同时,流程之外的某些内容发生了变化。通常,将执行以下操作以重新连接:
private final static int MAX_RETRY_COUNT = 5;
//...
int retryCount = 0;
int angle = -1;
while(true)
{
try
{
angle = getAngle();
break;
}
catch(NoAngleException e)
{
if(retryCount > MAX_RETRY_COUNT)
{
throw new RuntimeException("Could not execute getAngle().", e);
}
// log error, warning, etc.
retryCount++;
continue;
}
}
// now you have a valid angle
我认为您应该调查为什么getAngle()引发异常,然后解决问题。如果这是随机的,例如来自传感器的输入,也许您应该等待一段时间才能再次调用。您也可以使getAngle()阻塞,这意味着getAngle()将等待,直到获得良好的结果。
忽略您如何解决问题,您应该具有某种超时机制,因此您不会陷入无限循环。假设您当然不希望有无限循环。
您想调用一个方法,只要它引发异常?
这不是编程。您应该使用调试器,然后看看真正的问题。
而且您应该永远不要在没有任何消息或记录的情况下捕获异常!
您是否可以使用递归?即;]]
private final static int MAX_RETRY_COUNT = 5;
//...
int retryCount = 0;
Object connection = null;
while(true)
{
try
{
connection = getConnection();
break;
}
catch(ConnectionException e)
{
if(retryCount > MAX_RETRY_COUNT)
{
throw new RuntimeException("Could not execute getConnection().", e);
}
try
{
TimeUnit.SECONDS.sleep(15);
}
catch (InterruptedException ie)
{
Thread.currentThread().interrupt();
// handle appropriately
}
// log error, warning, etc.
retryCount++;
continue;
}
}
// now you have a valid connection
我不建议那样做,因为当getAngle()从不返回有效值(由于某种原因总是抛出异常)时,您将陷入无限循环。对于这种情况,您至少应定义一个中断条件(例如超时)。
最后,我选择返回NaN值,因为这可以防止在其他地方粗心地使用Integer.MIN_VALUE。
除非您使用的类完全超出您的控制范围,否则您确实要重新考虑引发异常以指示无角度。
切勿使用异常处理代码中的流程逻辑。