如果发生任何异常,如何在try块中重试特定的代码段?

时间:2014-09-08 22:54:19

标签: java try-catch

我需要使用JSOUP解析来自URL的HTML表格,现在一切正常。现在我想添加一个重试机制,如果我看到任何异常。以下是我的代码 -

public void collectMetrics() {
    try {
        URL url = new URL("some_url");
        Document doc = Jsoup.parse(url, 9000);
        for (Map.Entry<String, String> entry : mappings.entrySet()) {
            calculateDiskFree(doc, entry.getValue(), entry.getKey());
        }
        // if it comes here, then it means everything is done successfully 
        // so no retry has to happen now
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果catch块中发生任何异常,我想重试我在try块中执行n次的所有操作。有可能吗?

3 个答案:

答案 0 :(得分:5)

你可以把它放在一个循环中。

boolean successful = false;
while (!successful) {
    try {
        URL url = new URL("some_url");
        Document doc = Jsoup.parse(url, 9000);
        for (Map.Entry<String, String> entry : mappings.entrySet()) {
            calculateDiskFree(doc, entry.getValue(), entry.getKey());
        }
        successful = true;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是你可能想要考虑如果它一直失败会发生什么。 如果您只想重试一些特定次数,可以使用for循环。

for (int retries = 0; retries < 3; ++retries) {
    try {
        URL url = new URL("some_url");
        Document doc = Jsoup.parse(url, 9000);
        for (Map.Entry<String, String> entry : mappings.entrySet()) {
            calculateDiskFree(doc, entry.getValue(), entry.getKey());
        }
        break;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:2)

将try块包裹在无限循环中,并在工作代码后添加return;

public void collectMetrics() {
    for (;;) {
        try {
            URL url = new URL("some_url");
            Document doc = Jsoup.parse(url, 9000);
            for (Map.Entry<String, String> entry : mappings.entrySet()) {
                calculateDiskFree(doc, entry.getValue(), entry.getKey());
            }
            return;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果您想限制尝试次数(推荐),请填写for循环,即代替for (;;),使用:

for (int i = 0; i < 10; i++) {  // try max 10 times

答案 2 :(得分:0)

围绕try catch语句创建一个while语句,然后设置一些东西来告诉while循环停止重复。