【问题标题】:Catching exceptions caused by temporary network errors捕获临时网络错误导致的异常
【发布时间】:2011-02-26 06:42:38
【问题描述】:

我必须下载一些 URL,并且在操作过程中可能会出现一些异常,例如 java.net.NoRouteToHostException。我认为这是一个临时错误异常,因为如果您在一段时间后重试下载可以成功。
所以,我想捕捉所有与临时错误相关的异常,我从这些开始:java.net.NoRouteToHostExceptionjava.net.SocketException
您能否列出其他类似的例外情况?

【问题讨论】:

  • java.net.SocketException 是 java.net.NoRouteToHostException 的父级,因此您可能只能捕获父级。 SocketException 的其他孩子是 BindException、ConnectException 和 PortUnreachableException。也许在你的情况下只捕获 SocketException 是可以的......

标签: java exception exception-handling network-programming


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      正如@reef 已经说过 java.net.NoRouteToHostException 扩展了 java.net.SocketException,所以如果你捕获 java.net.SocketException 就足够了。但是 java.net.SocketException 扩展了 IOException ,我认为这是你真正应该抓住的。所有的 IO 问题都应该抛出这个异常。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 但您可能不想将java.net.MalformedURLException 视为临时网络错误。
        猜你喜欢
        • 1970-01-01
        • 2014-08-26
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 2015-06-20
        相关资源
        最近更新 更多