【发布时间】:2010-09-13 04:16:08
【问题描述】:
我一直觉得期望定期抛出异常并将它们用作流逻辑是一件坏事。异常感觉应该是“exception”。如果您期待并计划出现异常,这似乎表明您的代码应该被重构,至少在 .NET 中...
然而。最近的一个场景让我停下来。我不久前在 msdn 上发布了这个,但我想引起更多关于它的讨论,这是一个完美的地方!
因此,假设您有一个数据库表,其中有几个其他表的外键(在最初引发辩论的情况下,有 4 个外键指向它)。您希望允许用户删除,但前提是没有外键引用;你不想级联删除。
我通常只是检查是否有任何引用,如果有,我会通知用户而不是删除。在 LINQ 中编写它非常容易和轻松,因为相关表是对象上的成员,因此 Section.Projects 和 Section.Categories 等很适合使用智能感知和所有...
但事实是 LINQ 可能必须访问所有 4 个表以查看是否有任何结果行指向该记录,并且访问数据库显然总是一个相对昂贵的操作。
该项目的负责人要求我将其更改为仅捕获代码为 547(外键约束)的 SqlException 并以这种方式处理它。
我……
抗拒。
但是在这种情况下,吞下与异常相关的开销可能比吞下 4 个表命中要有效得多……尤其是因为我们必须在每种情况下都进行检查,但我们可以避免这种情况下的异常没有孩子的时候...
另外,数据库确实应该负责处理引用完整性,这是它的工作,它做得很好......
所以他们赢了,我改变了它。
但在某种程度上,我仍然觉得 错。
你们如何看待期待和有意处理异常?当它看起来比事先检查更有效率时可以吗?下一个查看您的代码的开发人员是否更容易混淆,或者更容易混淆?是否更安全,因为数据库可能知道开发人员可能不会考虑添加检查的新外键约束?还是您认为最佳实践是什么?
【问题讨论】:
标签: .net sql sql-server exception-handling