【问题标题】:Java 7 precise rethrow and legacy codeJava 7 精确的重新抛出和遗留代码
【发布时间】:2011-11-10 09:59:28
【问题描述】:

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

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

【问题讨论】:

  • 我建议您在您的问题中添加以下句子:“我的目标是……”到目前为止,您还没有得到好的建议,因为人们一直在猜测您的目标是错误的。
  • 我认为这个问题很清楚:为了更新懒惰编写的遗留代码以引发过于广泛的异常,是否有一种工具可以找到这样的代码,以便可以使用新的方便的 Java7 语法。

标签: java exception java-7 rethrow


【解决方案1】:

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

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

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

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

沿着同一行参数,请注意,当您尝试捕获不可能抛出的(已检查)异常时,您将得到一个编译错误,但您可以添加到throws方法签名的子句实现体不使用的各种异常。

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


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

更新 2:即使对于 final 方法,您也可能希望在不破坏界面的情况下保留您的选项,以便将来抛出更多异常。

【讨论】:

    【解决方案2】:

    尝试在 throw 之前抛出异常,也许它会成功?

    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);
      }
    }
    

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

    【讨论】:

    • 重点是在 Java 7 中这不是必要的:您可以使用throws FirstException, SecondException和使用简单的throw e。跨度>
    猜你喜欢
    • 2011-10-16
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2010-09-09
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多