框架代码:静默失败或引发异常

本文关键字:异常 失败 代码 静默 框架 | 更新日期: 2023-09-27 18:00:51

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

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

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

框架代码:静默失败或引发异常

正如其他人所说,这可能是主观的,也可能取决于上下文和情况。不过,一般来说,我认为投掷是最好的选择。

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

老板:嘿,乔,你能帮我一个忙,跑到会计处帮我把这些重要文件送到那里吗
乔:当然,没问题。

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

可能的后续#1:

乔回到他的老板身边:对不起,办公室关门了。如果你愿意,我可以稍后再试,或者你可以选择其他方式来交付文件?

可能的后续#2:

乔意识到他无法完成任务,所以他把文件扔进了垃圾桶。。嗯…垃圾箱,今天到此为止

如果你是老板,你会选择哪一个?

这"实际上"是一个主观问题,取决于具体情况。

例如,如果这个api在DB上提供了一些操作,并且每当api用户想要创建记录时,默默地忽略将是一件令人头疼的事情。

另一方面,如果此操作只是可选的,则忽略不会造成任何伤害。例如,api开发人员可能希望通过使用web服务来节省使用该api执行的操作数量。在这种情况下,如果服务不可用,您可能会以静默方式失败,因为这不是api的目的。

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

我认为您应该抛出一个异常。如果你遵循最小惊奇原则(POLA(,PerformAction应该采取行动。因此,如果项目是null,则不能执行该操作,并且您希望得到反馈。

但正如所说,这是高度主观的。