在Java中,在不引发任何异常之前继续调用函数的最佳方法是什么?

问题描述 投票:6回答:8

在我的Java代码中,我有一个名为getAngle()的函数,有时会抛出NoAngleException。以下代码是编写不断调用getAngle()直到没有引发异常的函数的最佳方法吗?

public int getAngleBlocking()
{
    while(true)
    {
        int angle;
        try
        {
            angle = getAngle();
            return angle;
        }
        catch(NoAngleException e)
        {

        }
    }
}

或者重写错误时返回getAngle()的更好的主意?

java exception exception-handling
8个回答
8
投票

我很惊讶地阅读了该线程的一些答案,因为这种情况恰好是存在检查异常的原因。您可以执行以下操作:

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

5
投票

我认为您应该调查为什么getAngle()引发异常,然后解决问题。如果这是随机的,例如来自传感器的输入,也许您应该等待一段时间才能再次调用。您也可以使getAngle()阻塞,这意味着getAngle()将等待,直到获得良好的结果。

忽略您如何解决问题,您应该具有某种超时机制,因此您不会陷入无限循环。假设您当然不希望有无限循环。


3
投票

您想调用一个方法,只要它引发异常?

这不是编程。您应该使用调试器,然后看看真正的问题。

而且您应该永远不要在没有任何消息或记录的情况下捕获异常!


3
投票

您是否可以使用递归?即;]]

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

2
投票

我不建议那样做,因为当getAngle()从不返回有效值(由于某种原因总是抛出异常)时,您将陷入无限循环。对于这种情况,您至少应定义一个中断条件(例如超时)。


1
投票

最后,我选择返回NaN值,因为这可以防止在其他地方粗心地使用Integer.MIN_VALUE。


0
投票

除非您使用的类完全超出您的控制范围,否则您确实要重新考虑引发异常以指示无角度。


0
投票

切勿使用异常处理代码中的流程逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.