假设我有一个存在于库/框架中的方法,我想知道这些方法是应该抛出异常还是静默失败;例如:
void PerformAction(Item item)
{
// throws NullReferenceException if item is null
item.DoThis();
}
void PerformAction(Item item)
{
//fails silently
if(item != null)
{
item.DoThis();
}
}
哪种解决方案更好 - 或者这是一个主观问题?
答案 0 :(得分:3)
这是"真的"一个主观的问题,取决于案例。
例如,如果这个api在数据库上提供了一些操作,并且每当api用户想要创建一个记录时,忽略静默就会很头疼。
另一方面,如果此操作仅是可选的,则忽略不会造成伤害。例如,api开发人员可能希望通过使用Web服务来保存使用此API执行的操作数。在这种情况下,如果服务不可用,您可能会无声地失败,因为这不是api的目的。
另外,存在另一种选择;您可以简单地提供不同类型的异常来提供有关可选异常的数据。您可以允许用户通过配置启用或禁用此选项。
答案 1 :(得分:1)
我认为你应该抛出异常。
如果您遵循Principle of Least Astonishment(POLA),PerformAction
应该采取行动。因此,如果项目为null
,则您无法执行操作,并且您会收到反馈。
但如上所述,这是非常主观的。
答案 2 :(得分:1)
正如其他人所说,这可能是主观的,也可能取决于背景和情况。但作为一般规则,我认为投掷是目前最好的选择。
我喜欢这个简单的比喻;虽然天真,但它有一个明确而有效的观点:
老板:嘿乔,你能帮我一个忙吗到会计并为我提供这些重要文件吗?
Joe:当然,没问题。
乔下到会计,但发现门被锁了,每个人都去吃午餐
可能的后续行动#1:
乔回到他的老板那里:抱歉,办公室已关闭。如果您想要我,我可以稍后再试一次,或者您可能还有其他选择来获取文件?
可能的后续行动#2:
乔意识到他无法完成任务,所以他只是将文件丢弃在垃圾收集器......嗯..垃圾箱中,并且每天调用它。
如果你是老板,你更喜欢哪个选项?