繁体   English   中英

是否应该尽早抛出异常?

[英]Is it good practice to throw an exception sooner than later?

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

class MyClass {

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

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

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

但我可以在workOnArray插入一个额外的检查,换句话说,可以更快地检测到问题。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM