Java 7精确重播和遗留代码
更精确的rethrow允许编写抛出真正抛出的异常的代码:Java 7精确重播和遗留代码,java,exception,java-7,rethrow,Java,Exception,Java 7,Rethrow,更精确的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 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;
}
}
我的问题:是否有一种工具允许检测不精确的抛出,以便将“异常
”替换为“第一异常,第二异常
”
到目前为止,我已经检查了Eclipse中是否没有编译器警告。FindBugs或CodePro中没有规则。在抛出之前尝试抛出异常,也许它会奏效
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);
}
}
顺便说一句,对我来说,重新引用相同的异常似乎相当笨拙…我认为这不是编译器警告的情况,因为“过于宽泛”的异常不一定是问题:除非方法是final或private,否则它定义了任何子类实现可以抛出的异常类型。在这种情况下,广泛的范围可能是故意的 您的问题同样适用于Java pre-7:
public void foo(String bar) throws Exception {
// Code that may throw both FirstException and SecondException
}
在这里,抛出异常
也可能被认为是不好的做法(但没有警告)
同样,请注意,当您试图捕获不可能抛出的(已检查的)异常时,将出现编译错误,但您可以将实现主体不使用的所有类型的异常添加到方法签名的throws
子句中
不过像FindBugs这样的工具会很有用
更新:“除非方法是final或private”:我必须同意,对于private或final方法(也可能是静态方法),可能会有一个警告
更新2:即使对于最终方法,您也可能希望保留选项,以便将来在不破坏接口的情况下抛出更多异常。关键是,在Java 7中,这不是必需的:您可以使用
throws FirstException,第二个例外
并使用一个简单的抛出e
。我建议您在问题中添加以下句子:“我的目标是…”到目前为止,你还没有得到很好的建议,因为人们一直在猜测你的目标是错误的。我认为问题很清楚:为了更新那些懒散编写的遗留代码,从而引发过大的异常,是否有一个工具可以找到这样的代码,以便使用新的方便的Java7语法进行更新。