框架代码:静默失败或抛出异常
Framework code: Fail silently or throw exceptions
假设我有一个存在于 library/framework 中的方法,我想知道这些方法是应该抛出异常还是静默失败;例如:
void PerformAction(Item item)
{
// throws NullReferenceException if item is null
item.DoThis();
}
void PerformAction(Item item)
{
//fails silently
if(item != null)
{
item.DoThis();
}
}
哪个解决方案更好 - 或者这是一个有点主观的问题?
这是"really"一个主观问题,视情况而定。
例如,如果这个api提供了一些对数据库的操作,每当api用户想要创建一条记录时,默默地忽略会很头疼。
另一方面,如果这个操作只是可选的,那么忽略也没有什么坏处。例如,api 开发人员可能希望通过使用 Web 服务来保存使用此 api 执行的操作数。在这种情况下,如果服务不可用,您可能会静默失败,因为这不是 api.
的目的
此外,还有另一种选择;您可以简单地提供不同类型的异常来提供有关可选异常的数据。并且您可以允许用户通过配置启用或禁用此选项。
我认为你应该抛出异常。
如果你遵循 Principle of Least Astonishment(POLA),PerformAction
应该做一个动作。因此,如果该项目是 null
,您将无法执行该操作,并且您会期待反馈。
但如前所述,这是非常主观的。
正如其他人所说,这可能是主观的,也可能取决于上下文和情况。不过,作为一般规则,我认为投掷是迄今为止更可取的选择。
我喜欢这个简单的类比;尽管它可能很天真,但它提出了一个明确而有效的观点:
老板:嘿,乔,你能帮我一个忙,运行 把这些重要文件交给我吗?
乔: 当然,没问题。
乔去会计部,但发现门锁着,大家出去吃午饭
可能的后续行动 #1:
Joe returns 给他的老板: 抱歉,办公室关门了。如果您需要,我可以稍后再试,或者您有其他选择来交付文件吗?
可能的后续行动 #2:
Joe 意识到他无法完成任务,所以他只是将文档放入垃圾收集器.. 嗯.. 垃圾容器,然后收工了。
如果你是老板,你更喜欢哪个选项?
假设我有一个存在于 library/framework 中的方法,我想知道这些方法是应该抛出异常还是静默失败;例如:
void PerformAction(Item item)
{
// throws NullReferenceException if item is null
item.DoThis();
}
void PerformAction(Item item)
{
//fails silently
if(item != null)
{
item.DoThis();
}
}
哪个解决方案更好 - 或者这是一个有点主观的问题?
这是"really"一个主观问题,视情况而定。
例如,如果这个api提供了一些对数据库的操作,每当api用户想要创建一条记录时,默默地忽略会很头疼。
另一方面,如果这个操作只是可选的,那么忽略也没有什么坏处。例如,api 开发人员可能希望通过使用 Web 服务来保存使用此 api 执行的操作数。在这种情况下,如果服务不可用,您可能会静默失败,因为这不是 api.
的目的此外,还有另一种选择;您可以简单地提供不同类型的异常来提供有关可选异常的数据。并且您可以允许用户通过配置启用或禁用此选项。
我认为你应该抛出异常。
如果你遵循 Principle of Least Astonishment(POLA),PerformAction
应该做一个动作。因此,如果该项目是 null
,您将无法执行该操作,并且您会期待反馈。
但如前所述,这是非常主观的。
正如其他人所说,这可能是主观的,也可能取决于上下文和情况。不过,作为一般规则,我认为投掷是迄今为止更可取的选择。
我喜欢这个简单的类比;尽管它可能很天真,但它提出了一个明确而有效的观点:
老板:嘿,乔,你能帮我一个忙,运行 把这些重要文件交给我吗?
乔: 当然,没问题。
乔去会计部,但发现门锁着,大家出去吃午饭
可能的后续行动 #1:
Joe returns 给他的老板: 抱歉,办公室关门了。如果您需要,我可以稍后再试,或者您有其他选择来交付文件吗?
可能的后续行动 #2:
Joe 意识到他无法完成任务,所以他只是将文档放入垃圾收集器.. 嗯.. 垃圾容器,然后收工了。
如果你是老板,你更喜欢哪个选项?