如何记录未经检查的异常?[已关闭]

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在那里对我没有多大帮助,也没有任何工具。由于我不知道任何工具...

你如何处理这种情况?


答案 1

仅记录您明确抛出自己或从其他方法传递的那些。残余的被解释为错误,这些错误将通过良好的单元测试和编写可靠的代码来修复。

在这种特殊情况下,我会在你的代码中作为一个错误,我会相应地修复代码,它永远不会抛出它。即,添加一个检查数组索引是否在范围内,并通过抛出一个异常(您记录的异常)或采用替代路径进行相应的处理。ArrayIndexOutOfBoundsException


答案 2

代码越复杂,就越难想到该方法可能引发的所有未经检查的异常。

当你看到一个问题时,我看到一个很好的理由来保持你的代码简单;-)

在您的示例中,我建议记录.仅仅因为这是某人在向你的方法提供错误参数时可以拥有的东西,并且应该在某个地方编写:“如果你给出了一个无效的数组索引,你会得到一个.例如,如果索引无效,它可以引发的方法文档。ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionString#charAt()IndexOutOfBoundException

通常,您不应记录可能出现的异常。你无法预测它们,你很可能会忘记一个。所以,记录那些显而易见的,你通过的那个。尝试列出尽可能多的例外,但不要花太多时间在上面。毕竟,如果您忘记了一个应该记录的文档,则可以在以后改进文档。


推荐