2

我正在使用JSoup连接到一个网站。我有时会发现 JSoup连接超时,当这种情况发生时,我想 JSoup重试连接,当它第三次失败时,它将向数组列表添加一个字符串。

我目前的代码是:

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 循环做一些事情,但我必须返回元素,所以我不确定如何做到这一点。

4

2 回答 2

7
    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");
    }
于 2012-05-09T02:29:46.923 回答
1

这是基于 Rodri_gore 回答的稍微简洁的版本。它使用 for 循环而不是 while 循环,并利用“doc”只有在循环在三个超时后正常退出时才会为 null 的事实。

之所以如此,是因为我捕获了 SocketTimeoutException。如果我试图在同一个 try/catch 块中捕获其他异常,那么逻辑将不再成立。"doc" 可能为 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 可能抛出的所有其他异常。

于 2014-04-06T05:30:31.133 回答