Java 捕获由临时网络错误引起的异常
我必须下载一些URL,在操作过程中可能会发生一些异常,如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的父项,
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
视为临时网络错误。