是否应该尽早抛出异常?

时间:2010-10-06 13:13:03

标签: language-agnostic exception

今天我遇到了以下情况:(“伪代码”)

class MyClass {

    public void workOnArray(Object[] data) {
        for (Object item : data) {
            workOnItem(item);
        }
    }

    public void workOnItem(Object item) {
        if (item == null) throw new NullPointerException();
    }
}

现在,如果来电者使用包含workOnArray项的数组调用null,则调用者会因NullPointerException而获得workOnItem

但我可以在workOnArray中插入附加检查,换句话说,可以更快地检测到问题。

(请注意,这是一个简单的例子,在现实生活中,这可能不太明显)。

在专业方面,我会说额外的检查可以提供更多高级诊断信息。早期失败总是一件好事。

另一方面,我会问自己“如果我这样做,我是否也应该验证传递给我的编程语言的核心API的每个参数并抛出完全相同的异常?”

在提早抛出异常以及何时让被调用者抛出异常时,是否有一些经验法则?

2 个答案:

答案 0 :(得分:8)

在循环处理这样的项目的情况下,有一件事肯定会让我想先预先验证整个项目数组;如果在抛出异常之前处理某些项目是不好的,则不处理任何剩余的项目。

除非包含代码的某种事务机制,我通常希望在开始处理代码之前确保集合中的项目有效。

答案 1 :(得分:2)

在此示例中,workOnItem方法是关注item是否为null的方法。 workOnArray方法不关心项目是否为空,因此IMO不应验证任何项目是否为空。 workOnItem方法非常小心,因此应该执行检查。

我还会考虑从workOnItem中抛出一个更合适的异常类型。 NullPointerException(或在C#中,NullReferenceException)通常表示方法操作中存在一些意外缺陷。在C#中,我更倾向于抛出包含null参数名称的ArgumentNullException。这更清楚地表明workOnItem无法继续,因为它无法处理接收null参数。

相关问题