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

时间:2011-02-24 15:37:32

标签: java exception exception-handling network-programming

我必须下载一些URL,并且可能会发生在操作期间可能发生一些异常,例如java.net.NoRouteToHostException。我认为这是一个临时错误异常,因为如果你在一段时间后重试它,下载就可以成功 所以,我想抓住所有与临时错误相关的例外情况,我已经开始使用这些:java.net.NoRouteToHostExceptionjava.net.SocketException
你能列出其他类似的例外吗?

4 个答案:

答案 0 :(得分:4)

java.net.SocketExceptionjava.net.NoRouteToHostException的父级,因此您可能只能抓住父级。 SocketException的其他孩子为BindExceptionConnectExceptionPortUnreachableException。也许在你的情况下只能抓住SocketException ......

答案 1 :(得分:2)

有时用于处理可重试操作的暂时性错误的一种模式是定义错误回调接口和一些实现它的类;当发生错误时,让回调对象知道,并让它决定是否应该抛出异常或者应该重试该动作。由于现有的通信类不遵循这种模式,因此可能需要捕获它们的异常并将它们转换为回调。

请注意,与正常的异常处理相比,此方法允许更清晰地处理许多错误处理方案。除此之外,它还可以轻松设置可以尝试重试次数的策略,可以使用多长时间等等,并且还提供了一种在收到类似“取消”请求的情况下跳过未来重试的方法。

答案 2 :(得分:0)

由于@reef已经说java.net.NoRouteToHostException会侵犯java.net.SocketException,所以如果你捕获java.net.SocketException就足够了。但java.net.SocketException扩展了IOException,我认为这是你真正需要捕获的。所有IO问题都应抛出此异常。

答案 3 :(得分:0)

HttpRetryException是另一个。也许java.net中的所有东西都没有扩展SocketException?

一种快速(非常脏)的方式可能是

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