框架代码:静默失败或抛出异常

Framework code: Fail silently or throw exceptions

假设我有一个存在于 library/framework 中的方法,我想知道这些方法是应该抛出异常还是静默失败;例如:

void PerformAction(Item item)
{
    // throws NullReferenceException if item is null
    item.DoThis();
}

void PerformAction(Item item)
{
    //fails silently
    if(item != null)
    {
        item.DoThis();
    }
}

哪个解决方案更好 - 或者这是一个有点主观的问题?

这是"really"一个主观问题,视情况而定。

例如,如果这个api提供了一些对数据库的操作,每当api用户想要创建一条记录时,默默地忽略会很头疼。

另一方面,如果这个操作只是可选的,那么忽略也没有什么坏处。例如,api 开发人员可能希望通过使用 Web 服务来保存使用此 api 执行的操作数。在这种情况下,如果服务不可用,您可能会静默失败,因为这不是 api.

的目的

此外,还有另一种选择;您可以简单地提供不同类型的异常来提供有关可选异常的数据。并且您可以允许用户通过配置启用或禁用此选项。

我认为你应该抛出异常。 如果你遵循 Principle of Least Astonishment(POLA),PerformAction 应该做一个动作。因此,如果该项目是 null,您将无法执行该操作,并且您会期待反馈。

但如前所述,这是非常主观的。

正如其他人所说,这可能是主观的,也可能取决于上下文和情况。不过,作为一般规则,我认为投掷是迄今为止更可取的选择。


我喜欢这个简单的类比;尽管它可能很天真,但它提出了一个明确而有效的观点:

老板:嘿,乔,你能帮我一个忙,运行 把这些重要文件交给我吗?
乔: 当然,没问题。

乔去会计部,但发现门锁着,大家出去吃午饭

可能的后续行动 #1:

Joe returns 给他的老板: 抱歉,办公室关门了。如果您需要,我可以稍后再试,或者您有其他选择来交付文件吗?

可能的后续行动 #2:

Joe 意识到他无法完成任务,所以他只是将文档放入垃圾收集器.. 嗯.. 垃圾容器,然后收工了。

如果你是老板,你更喜欢哪个选项?