Java catch块,捕获异常不是最终的

时间:2013-06-06 10:13:58

标签: java exception try-catch

我正在查看Java SE7的新功能,目前我正在这里:

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

关于catch catch功能,当我遇到这个声明时:

  

注意:如果catch块处理多个异常类型,那么   catch参数是隐式最终的。在这个例子中,捕获   参数ex是final,因此您无法为其指定任何值   在拦截区内。

我从未注意到在处理捕获的异常的经典案例中,捕获的异常不是最终的。

我只是想知道为什么这首先是好事?在我猜想重新抛出它或者记录它的消息之前,对于一个被捕获的异常进行必要的修改是不是不明智?是否应该由trowing机制来创建异常,以便它代表它应该是什么呢?

我从未见过在catch块中修改过的异常可能有人指出它有什么好处?

谢谢!

4 个答案:

答案 0 :(得分:4)

它与方法参数几乎相同:

通常不修改它们许多人同意将它们视为final(是否实际写{{1}在他们面前是一个有争议的问题。)

但由于没有技术要求说它必须是final,因此该语言可让您选择。

我个人认为没有理由修改catch-block的异常引用。

答案 1 :(得分:3)

我无法想象一个令人信服的用例来修改经典catch子句中的异常。但是,这并不意味着它应该被禁止。特别是假设您可以修改参数变量。如果您发现这令人担忧,您可以选择将异常变量声明为final

另一方面,允许修改多异常捕获会引入真正奇怪和令人困惑的代码的可能性,例如:

  catch (IOException | NullPointerException ex) {
      ...
      ex = new IllegalArgumentException(...);
  }

我想这就是设计师在这种情况下加入限制时的想法。

但不管怎样,这就是Java语言的定义方式,以及我们必须接受的内容。除非你打算设计和实现一种新语言,否则在讨论明显的不一致性方面没有太多意义。

答案 2 :(得分:0)

我能想到最终强制执行的原因是由于表现。一旦捕获评估开始,在评估机制中具有最终的不可变值可确保更快地评估所有捕获量。由于try-catch广泛用于任何Java代码,因此最高性能设计更为可取。

基于以上所述,它意味着性能的提升会影响大多数程序。

答案 3 :(得分:0)

基于异常的错误处理背后的想法是,如果可能的话,应该在适当的抽象级别恢复每个错误。此类错误恢复可能需要在实际处理异常时无法直接获得的信息。由于这个原因,捕获异常可能很方便,用相关信息扩充它并重新抛出它,或者可能将它设置为更合适的类的新异常对象的原因。