【问题标题】:Framework code: Fail silently or throw exceptions框架代码:静默失败或抛出异常
【发布时间】:2015-09-19 15:05:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这将是非常主观的,尽管我相信大多数声音会说你应该主要是throw。至少出于调试目的。如果框架有日志记录机制,如果你不愿意抛出,你应该记录失败的任务。

标签: c# .net oop frameworks


【解决方案1】:

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


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

老板:嘿,乔,你能帮我一个忙,跑去会计部门,把这些重要的文件交给我吗?
Joe: 当然,没问题。

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

可能的后续行动#1:

乔回到他的老板那里:对不起,办公室关门了。如果您愿意,我可以稍后再试,或者您还有其他选择来获取文件?

可能的后续行动#2:

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

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

【讨论】:

    【解决方案2】:

    这“真的”是一个主观问题,视具体情况而定。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 2023-01-22
        • 2012-11-28
        • 2022-01-19
        • 2011-06-04
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多