Java 7精确的重新抛出和遗留代码

时间:2011-11-10 09:59:29

标签: java exception java-7 rethrow

更精确的重新抛出允许编写抛出异常抛出的异常的代码:

   public void foo(String bar) throws FirstException, SecondException {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

在Java 7之前,你必须写:

   public void foo(String bar) throws Exception {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

我的问题:是否有一个工具可以检测不精确的投掷,以便将“Exception”替换为“FirstException, SecondException”?

到目前为止,我已经检查过Eclipse中没有编译器警告。 FindBugs或CodePro中没有规则。

2 个答案:

答案 0 :(得分:1)

我认为这不是编译器警告的情况,因为“过于宽泛”的异常不一定是个问题:除非方法是final或private,否则它定义了任何子类实现可以抛出的异常类型。在这种情况下,广泛的范围可能是故意的。

您的问题同样适用于Java pre-7:

public void foo(String bar) throws Exception {
    // Code that may throw both FirstException and SecondException
}

在这里,throws Exception也可能被视为不良做法(但没有任何警告)。

沿着相同的论点,请注意,当您尝试捕获无法抛出的(已检查)异常时,您将收到编译错误,但您可以添加到{{1方法签名的子句,实现主体不使用的各种异常。

像FindBugs这样的工具会很有用。


更新:“除非方法是最终的或私有的”:我必须同意,对于私人或最终方法(也可能是静态方法),可能会有警告。

更新2:即使对于最终方法,您可能希望将选项保持打开状态,以便将来抛出更多例外而不会破坏界面。

答案 1 :(得分:-2)

尝试在抛出前抛出异常,也许它会起作用?

public void foo(String bar) throws FirstException, SecondException {
  try{
    // Code that may throw both FirstException and SecondException
  }
  catch (Exception e){
    throw ((e instanceof FirstException) ? (FirstException)e : (SecondException)e);
  }
}
顺便说一句,重新抛出同样的异常对我来说似乎很笨拙......