框架代码:无声地失败或抛出异常

时间:2015-07-02 07:51:24

标签: c# .net oop frameworks

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

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

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

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

3 个答案:

答案 0 :(得分:3)

这是"真的"一个主观的问题,取决于案例。

例如,如果这个api在数据库上提供了一些操作,并且每当api用户想要创建一个记录时,忽略静默就会很头疼。

另一方面,如果此操作仅是可选的,则忽略不会造成伤害。例如,api开发人员可能希望通过使用Web服务来保存使用此API执行的操作数。在这种情况下,如果服务不可用,您可能会无声地失败,因为这不是api的目的。

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

答案 1 :(得分:1)

我认为你应该抛出异常。 如果您遵循Principle of Least Astonishment(POLA),PerformAction应该采取行动。因此,如果项目为null,则您无法执行操作,并且您会收到反馈。

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

答案 2 :(得分:1)

正如其他人所说,这可能是主观的,也可能取决于背景和情况。但作为一般规则,我认为投掷是目前最好的选择。

我喜欢这个简单的比喻;虽然天真,但它有一个明确而有效的观点:

老板:嘿乔,你能帮我一个忙吗到会计并为我提供这些重要文件吗?
Joe:当然,没问题。

乔下到会计,但发现门被锁了,每个人都去吃午餐

可能的后续行动#1:

乔回到他的老板那里:抱歉,办公室已关闭。如果您想要我,我可以稍后再试一次,或者您可能还有其他选择来获取文件?

可能的后续行动#2:

乔意识到他无法完成任务,所以他只是将文件丢弃在垃圾收集器......嗯..垃圾箱中,并且每天调用它。

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