你如何记录未经检查的例外情况?

时间:2010-09-19 18:16:27

标签: java exception documentation exception-handling

Joshua Bloch在他的Effective Java中写道:

“使用Javadoc @throws标记记录每个未经检查的异常 方法可以抛出,但不要使用throws关键字来包含未选中 方法声明中的异常。 “

这听起来确实合理,但是如何找出,我的方法可以抛出什么未经检查的异常?

让我们想一下以下的课程:

public class FooClass {

    private MyClass[] myClass;

    /**
     * Creates new FooClass
     */
    public FooClass() { 
        // code omitted
        // do something with myClass
    }

    /**
     * Performs foo operation.<br />
     * Whatever is calculated.
     * @param index Index of a desired element
     * @throws HorribleException When something horrible happens during computation
     */
    public void foo(int index) {
        try {
            myClass[index].doComputation();
        } catch (MyComputationException e) {
            System.out.println("Something horrible happened during computation");
            throw new HorribleException(e);
        }
    }
}

现在,我记录了HorribleException,但很明显,foo方法也可以抛出未经检查的 java.lang.ArrayIndexOutOfBoundsException 。代码越复杂,就越难想到方法可以抛出的所有未经检查的异常。我的IDE在那里帮助不大,也没有任何工具。因为我不知道任何工具...

你如何处理这种情况?

5 个答案:

答案 0 :(得分:15)

仅记录您自己明确投掷或正在从另一种方法传递的内容。剩余部分应被视为缺陷,通过良好的单元测试和编写固体代码来解决。

在这种特殊情况下,我将ArrayIndexOutOfBoundsException帐号视为代码中的错误,我会相应地修改代码,因为它永远不会抛出它。即添加一个检查,看数组索引是否在范围内,并通过抛出异常 - 你记录 - 或采取替代路径来相应处理。

答案 1 :(得分:2)

  

代码越复杂,就越难想到方法可以抛出的所有未经检查的异常。

如果您发现问题,我认为保持代码简单是一个很好的理由; - )

在您的例子中,我建议记录ArrayIndexOutOfBoundsException。只是因为这是某人在给你的方法提供一个错误的参数时可以拥有的东西,它应该写在某处:“如果你给出了一个无效的数组索引,你将得到一个ArrayIndexOutOfBoundsException。例如,{{1如果索引无效,它可以抛出String#charAt()

通常,您不应该记录可能出现的例外情况。你无法预测它们,你很可能会忘记它们。因此,记录明显的,你应该的那个。尝试列出尽可能多的例外情况,但不要花很多时间在它上面。毕竟,如果您忘记了应该记录的文档,您可以稍后改进文档。

答案 2 :(得分:1)

仅记录您自己投掷的内容。

在这种情况下,我会进行索引边界检查并抛出我自己的异常: throw IllegalArgumentException("Index must be smaller than " +myClass.length + ", but is: " + index) 然后在JavaDoc中记录 IllegalArgumentException

答案 3 :(得分:0)

我们有一个在我们的测试服务器上运行的书面checkstyle扩展。在您的示例中,它将测试是否记录了HorribleException。

ArrayIndexOutOfBoundsException将通过代码审查进行检测。在您的示例代码中,我们的目标是抛出InvalidArgumentException而不是ArrayIndexOutOfBoundsException。可以从测试服务器找到它的文档。

ArrayIndexOutOfBoundsException可以是FindBugs中的警告。但我不确定。

答案 4 :(得分:-1)

您发布的报价,如果您想成为理想的程序员,您必须牢记这一点。编程并不是在考虑“什么可能出错”,而是思考如何以最好的方式做事并对其进行编程。如果它是个人项目,只需写下该方法的作用。

但是,有三种可能的解决方案:

  • 不要记录方法。
  • 仔细考虑代码的作用,并找出最常见的未经检查的异常可能是什么。将它们添加到Java-doc。如果你遇到一个新问题,找出问题是什么,并将其作为可能的例外添加。
  • 不关心可能的异常,只记录抛出方法体中的异常(例如:if (obj == null) { throw new NullPointerException(); })。