我正在使用JSoup
来连接网站。我有时会发现JSoup
会有连接超时,当发生这种情况时,我希望JSoup
重试连接,当它第3次失败时,它会将一个字符串添加到数组列表中。
目前我的代码是:
try {
Document doc = Jsoup.connect(sitemapPath)
.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
.timeout(10000)
.get();
Elements element = doc.select("loc");
return element;
} catch (IOException e) {
return null;
}
我正在考虑使用while循环做一些事情,但我必须返回元素,所以我不确定如何做到这一点。
答案 0 :(得分:6)
ArrayList<String> l = new ArrayList();
Document doc = null;
int i = 0;
boolean success = false;
while( i < 3){
try {
doc = Jsoup.connect(sitemapPath).get();
success = true;
break;
} catch (SocketTimeoutException ex){
l.add("text...");
}
catch (IOException e) {
}
i++;
}
if(success){
// Selector code ...
Elements element = doc.select("loc");
}
答案 1 :(得分:0)
根据Rodri_gore的回答,这是一个稍微简洁的版本。它使用for循环而不是一段时间,并利用&#34; doc&#34;如果循环在三次超时后正常退出,则只会为null。
这是因为我仅捕获SocketTimeoutException。如果我试图在同一个try / catch块中捕获其他异常,则逻辑将不再成立。 &#34;文档&#34;可能为null,因为发生了不同的异常。
顺便说一句,您可以使用http://www.google.com:81/ 测试超时错误。
Document doc = null;
for (int i = 1; i <= 3; i++) {
try{
doc = Jsoup.connect(url).get();
break; // Break immediately if successful
}
catch (SocketTimeoutException e){
// Swallow exception and try again
logger.warn("jsoup Timeout occurred " + i + " time(s)");
}
}
if (doc == null){
// Timed out 3 times. Do whatever you want here.
}
else{
// Do something with doc
}
我通常使用此代码创建一个实用程序方法,然后调用此方法传递url或连接对象。然后我在try catch中包装该方法调用来处理jsoup可能抛出的所有其他异常。