框架代码:静默失败或引发异常
本文关键字:异常 失败 代码 静默 框架 | 更新日期: 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
,则不能执行该操作,并且您希望得到反馈。
但正如所说,这是高度主观的。