异常处理以及在连接重置时如何最佳重试?

8
我有一些代码可以连接到URL以下载文件,然后对其进行处理。但是,有时我会收到错误消息“java.net.SocketException:Connection reset”。
当我收到此错误时,我想重试下载文件,最多重试3次,然后放弃。我想知道构建这个功能的最佳方法是什么。
以下内容是否正确?在while循环内部放置try-catch块是否可接受,还是有更好的方法?
非常感谢您的帮助!
while(!connected && retries > 0) {
  retries--;
  URL downloadUrl;
  URLConnection conn;

  try {
    downloadUrl = new URL(url);
    conn = downloadUrl.openConnection();
    conn.connect();
    connected = true;
    // Perform processing on downloaded file here

  } catch (IOException e) {
    Logger.batchLog(e);
  }
} 
3个回答

3

对于这种事情,我宁愿让一个防弹连接池来处理,而不是自己编写代码。


1

我一直认为吞掉异常总是不好的,但在这种情况下,我认为这是判断连接是否确实重置的唯一方法。我猜你根据自己的要求处理异常,所以这就是所有的事情。

但是,我建议你不要吞掉最后一个异常。如果它失败了三次,你会想重新抛出该异常或以某种优雅的方式失败。


这样做可以吗,还是处理事情的不好方式? 捕获(IOException e){ Logger.batchLog(e); 如果重试次数为0 { 抛出e; } } - QuakerOat
是的,那应该可以。或者,你可以终止进程并告诉用户服务器不可用。无论如何处理,你都不应该像什么也没发生一样忽略异常。我认为你目前没有这个问题。此外,你只想捕获 java.net.SocketException 而不是所有的 IOExceptions,因为这是你唯一知道如何(或希望)处理的。 - shoebox639

-1
AOP和Java注解应该会有所帮助。我建议使用jcabi-aspects(我是一名开发人员)中的现成机制:
@RetryOnFailure(attempts = 3, delay = 5)
public String load(URL url) {
  return url.openConnection().getContent();
}

您也可以尝试来自CactoosRetryFunc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接