【问题标题】:Is it useful to declare parent and child exceptions in the same throws clause?在同一个 throws 子句中声明父异常和子异常有用吗?
【发布时间】:2014-10-09 09:51:10
【问题描述】:

我知道下面的代码确实有意义:

try { ... }
catch (FileNotFoundException exc) { ... }
catch (IOException exc) { ... }

但是在 throws 子句中声明这些父子异常有意义吗?

假设我有以下代码:

public void doSomething() throws FileNotFoundException, IOException { ... }

我们都知道FileNotFoundExceptionIOException 的子类。现在这样声明它是否有意义以任何方式(可读性、性能等),反对只是这样:

public void doSomething() throws IOException { ... }

【问题讨论】:

    标签: java exception throws


    【解决方案1】:

    有时捕获两个异常是有意义的,只要首先指定子类异常(否则,我认为它甚至不会编译)。它允许您以与更一般的异常不同的方式处理您关心的特定异常。

    例如,我有从套接字读取的代码。这是一个阻塞读取,我设置了一个超时,因为可能没有什么可读取的。这就是为什么我抓住SocketTimeoutException 却什么也不做的原因。另一方面,如果我得到其他 IOExceptions(IOExceptionSocketTimeoutException 的间接超类),我将抛出异常,因为在尝试从套接字读取时发生了真正的失败。

        catch (SocketTimeoutException ignEx) {
    // -- ignore exception, as we are expecting timeout exceptions because
    // -- there might be nothing to read
        }
        catch (IOException ioEx) {
          throw new SomeException (...);
        }
    

    至于在方法签名中声明两者,不必在throws 子句中声明两者,但如果您在 JavaDoc cmets 中记录这两个异常,并描述它们中的每一个都被抛出的条件。

    【讨论】:

      【解决方案2】:

      对于Java编译器,子类是否在throws子句中并不重要,因为超类异常会覆盖它。

      但是,出于文档目的,这很重要。您的方法的调用者可能想知道它可以抛出子类异常,例如FileNotFoundException,并以不同的方式处理。

      try {
          doSomething();
      }
      catch (FileNotFoundException e) {
          System.out.println("File not found!");
      }
      catch (IOException e) {
          System.out.println("An I/O error has occurred: " + e.getMessage());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        相关资源
        最近更新 更多