我需要使用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
次的所有操作。有可能吗?
答案 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循环停止重复。