我有一个试图通过JSoup连接到html页面的程序。我在while循环中有这部分代码,目的是用至少 n 元素填充地图。在几乎伪代码中它看起来像这样:
while(!myMap.hasFiveKeys){
doc =JSoup.parse("http://www.website.com");
wordMap.fillFrom(doc);
}
我希望在catch块中,当任何网络相关异常被抛出时,我想增加一个计数器,然后我的while条件可以包含connectionAttempts<10
,这样如果连接失败10次,它停止尝试(如果一开始你没有成功,再尝试十次然后放弃)。
我不知道如何捕获所有与网络相关的异常。
答案 0 :(得分:1)
Connection.execute()(由get()
和post()
间接调用)记录它在its Javadoc中引发的所有异常。它们都是IOException的子类,因此您可以通过捕获IOException来捕获它们。
要回答问题的其他部分,你可以把它放在这样的重试循环中:
int connectionAttempts = 0;
while (map.size() < 5 || connectionAttempts < 10)
try {
Document d = Jsoup.connect(url).get();
fillUpMap(d, map);
//we connected successfully, reset the retry counter
connectionAttempts = 0;
if (map.size() < 5)
/* ... pick a new url for next iteration ... */
} catch (IOException e) {
++connectionAttempts;
}
实际上,您可能只想在超时或服务器错误(500等)的情况下重试,提前停止HTTP状态代码,表明请求不会成功(404,403,410等),或使用可配置的尝试次数。