【问题标题】:What is the advantage of using multiple exceptions in one catch block?在一个 catch 块中使用多个异常有什么好处?
【发布时间】:2011-08-25 19:21:08
【问题描述】:

我们都听说在 Java 7 中我们可以编写:

try {
   //something with files and IO
} catch (FileNotFoundException | IOException ex) {
    ex.printStackTrace();
    System.out.println("It's can't copy file");
}

而不是

try {
   //something with files and IO
} catch (FileNotFoundException wx) {
    ex.printStackTrace();
} catch (IOException ex) {
   ex.printStackTrace();
}

但是,除了更短的代码之外,它还有什么好处呢?
即使我们希望在每个 catch 块中完成相同的操作,我们也可以:

  1. 只捕获 IOException,因为 FileNotFoundException 是一个子类型。
  2. 如果一个异常不是另一个异常的子类型,我们可以编写一些handleException() 方法并在每个catch 块中调用它。

那么,这个功能是只用于更简洁的代码还是其他任何用途?

谢谢。

【问题讨论】:

  • DRY
  • 所以这是一个疯狂的问题。如果想为一个异常而不是另一个异常执行操作会发生什么。例如,您想要 filenotfound 但不是 io 的堆栈跟踪。 ex会打印2个错误的堆栈跟踪吗?是否有一种方法可以创建多个异常,例如这个 catch (FileNotFoundException wx | IOException ex)。注意 FileNotFoundException 末尾的 wx。然后,您是否可以针对不同的异常调用不同的操作,或者您是否坚持一刀切
  • @OVERTONE - 你确定你可以这样使用它吗?在我看到的所有示例中,两个异常对象都进入一个变量。
  • @dan 这就是我的意思。我不认为你可以这样使用它。我不在带有 java 7 或任何我的 IDES 的机器上,所以我无法检查。但我认为,如果我们可以选择在同一个块中使用这种漂亮的语法声明多个单独的异常,那就太好了。它看起来比拥有 6-8 个 catch 块要干净得多,但是如果您尝试记录特定异常或对其执行某些操作,那么您就不走运了。
  • 您可以编写一个 handleException 函数,但是:[1] 您需要在参数中传递所有相关信息(使辅助函数看起来比它需要的更复杂)并且 [2] 您无法从catch 中获得return,因为您将在另一个函数中。

标签: java java-7


【解决方案1】:

它不是为了让代码看起来更干净和节省击键次数。这些都是附带福利。

重复会导致不一致和错误。因此,通过创建不需要重复的语法,可以避免真正的错误。这就是 DRY 背后的动机——不是写得更快的漂亮代码。

【讨论】:

  • 虽然有人可能会争辩说,“不一致和错误”可以通过更简洁的代码来消除。
  • 是的,更简洁的代码是达到这个目的的一种手段(正确的代码),而不是目的本身。
  • 关于创建一个handleException() 方法,如果我们谈论的是具有
【解决方案2】:

是的,它主要是为了更简洁的代码。

【讨论】:

    【解决方案3】:

    这个想法相当于:

    if (myVar == true && myOtherVar == false)
        // Logic
    

    if (myVar == true)
    {
        if (myOtherVar == false)
            // Same logic
    }
    

    它只是更短、更简洁的代码。

    【讨论】:

      【解决方案4】:

      这是为了更简洁的代码.. 但这非常有价值。在某些情况下,您可能会抛出 4 或 5 个异常,并且如果您想做的所有事情在所有情况下都相同(通常是这种情况),那么会减少大量代码。

      这使它更具可读性和可测试性。这本身就足够有价值。

      【讨论】:

        【解决方案5】:

        更短的代码意味着更少的维护代码——这不是一个小优势。是的,我可以编写异常处理方法,但现在我不经常这样做了,例如仅当在不同的代码位置引发异常时。

        【讨论】:

          猜你喜欢
          • 2015-02-16
          • 1970-01-01
          • 1970-01-01
          • 2012-01-16
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-15
          相关资源
          最近更新 更多