重试一些异常递归

时间:2016-07-10 19:14:48

标签: java

我有一个使用代理从服务器检索信息的方法。有时由于代理不当,我会收到SocketExceptionSSLExceptionSSLHandshakeExceptionConnectException

我希望该方法重试上面的异常,但是在IOException上或者没有异常我希望返回一个字符串

这是我为测试不同场景而构建的方法

public String getTest(int i, int current, int total)
{
    String text = "";
    try
    {
        if (i == 1)
            throw new IOException();
        else if (i == 2)
            throw new SSLException("SSLEx");
        else if (i == 3)
            throw new SocketException();
        else
            text = "EVERYTHING GOOD";
    }
    catch (SSLException | SocketException re)
    {
        if (current < total)
        {
            System.out.println("Recalling " + current);
            getTest(1, ++current, total);
        }
    }
    catch (IOException ioe)
    {
        text = "HTTP ERROR";
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return text;
}

我通过

调用我的测试方法
System.out.println(c.getTest(3, 0, 5));

最初程序会捕获SocketException,然后通过传递1重试,这样我就可以模拟一个工作代理,但是IOException的服务器响应为i = 1,但该方法永远不会返回文本& #34; HTTP错误&#34;

为了使其按预期工作,我需要更改什么?

1 个答案:

答案 0 :(得分:3)

为了返回递归函数调用返回的字符串,必须在递归函数调用之前放置return,如此...

return getTest(1, ++current, total);

现在您只需运行递归函数并丢弃其返回值。然后,您的逻辑将从初始调用返回text字符串(在SSLException的情况下,它看起来像一个空字符串)。

您也可以通过从递归函数中分配text来实现相同的效果......

text = getTest(1, ++current, total);

考虑到其余逻辑,这两个陈述都是等价的。