6

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

   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 中没有规则。

4

2 回答 2

1

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

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

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

在这里,throws Exception也可能被认为是不好的做法(但没有关于它的警告)。

沿着同一条论点,请注意,当您尝试捕获不可能抛出的(已检查)异常时,您将收到编译错误throws,但您可以将实现主体的所有类型的异常添加到方法签名的子句中不使用。

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


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

更新 2:即使对于最终方法,您也可能希望保留选项以在将来抛出更多异常而不会破坏接口。

于 2011-11-10T11:55:00.657 回答
-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);
  }
}

顺便说一句,重新抛出相同的异常对我来说似乎相当笨拙......

于 2011-11-10T11:21:43.747 回答