Java 捕获由临时网络错误引起的异常

Java 捕获由临时网络错误引起的异常,java,exception,exception-handling,network-programming,Java,Exception,Exception Handling,Network Programming,我必须下载一些URL,在操作过程中可能会发生一些异常,如java.net.noroutetohestException。我认为这是一个临时错误异常,因为下载可以在一段时间后重试。 因此,我想捕获所有与临时错误相关的异常,我从以下内容开始:java.net.NoRouteToHostException,java.net.SocketException 您可以列出其他类似的异常吗?java.net.SocketException是java.net.noroutetohestexception的父项,

我必须下载一些URL,在操作过程中可能会发生一些异常,如
java.net.noroutetohestException
。我认为这是一个临时错误异常,因为下载可以在一段时间后重试。 因此,我想捕获所有与临时错误相关的异常,我从以下内容开始:
java.net.NoRouteToHostException
java.net.SocketException


您可以列出其他类似的异常吗?

java.net.SocketException
java.net.noroutetohestexception
的父项,因此您可能只能捕获父项。
SocketException
的其他子项是
BindException
ConnectException
PortUnreachableException
。在您的情况下,也许只捕获
SocketException
是可以的…

因为@reef已经说过java.net.NoRouteToHostException包含java.net.SocketException,所以如果捕获java.net.SocketException就足够了。但是java.net.SocketException扩展了IOException,我认为这才是您真正应该关注的。所有IO问题都应引发此异常。

HttpRetryException是另一个异常。也许java.net中没有扩展SocketException的所有内容

一种快速(而且非常肮脏)的方法可能是

try {
....
} catch(Exception e) {
    if(e.getClass().getPackage().getName().equalsIgnoreCase("java.net")) {
        retry();
    }
}

在处理可重试操作上的暂时性错误时,有时有用的一种模式是定义一个错误回调接口和一些实现它的类;当发生错误时,让回调对象知道,并让它决定是引发异常还是重试操作。因为现有的通信类不遵循这种模式,所以可能需要捕获它们的异常并将其转换为回调


注意,与正常的异常处理相比,这种方法允许更干净地处理许多错误处理场景。除其他外,它可以轻松设置重试次数、重试时间等策略,还提供了一种在收到“取消”请求时跳过未来重试的方法。

java.net.SocketException是java.net.noroutetohestexception的父级,因此您可以只捕获父级。SocketException的其他子项是BindException、ConnectException和PortUnreachableException。在您的情况下,可能只捕获SocketException是可以的……但您可能不希望将
java.net.MalformedUrlexException
视为临时网络错误。