从网络问题中捕获所有异常

时间:2014-03-08 11:22:37

标签: exception connection jsoup

我有一个试图通过JSoup连接到html页面的程序。我在while循环中有这部分代码,目的是用至少 n 元素填充地图。在几乎伪代码中它看起来像这样:

while(!myMap.hasFiveKeys){
    doc =JSoup.parse("http://www.website.com");
      wordMap.fillFrom(doc);
 }

我希望在catch块中,当任何网络相关异常被抛出时,我想增加一个计数器,然后我的while条件可以包含connectionAttempts<10,这样如果连接失败10次,它停止尝试(如果一开始你没有成功,再尝试十次然后放弃)。

我不知道如何捕获所有与网络相关的异常。

1 个答案:

答案 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等),或使用可配置的尝试次数。