【问题标题】:Which exception should I throw if the requested entity does not exist in Db? [closed]如果请求的实体在 Db 中不存在,我应该抛出哪个异常? [关闭]
【发布时间】:2012-12-25 20:46:12
【问题描述】:

想象一个方法,它试图检索一个实体,根据业务逻辑(针对特定情况),该实体应该存在于 Db 中。

当我尝试通过我的存储库从 Db 中检索它时,如果我返回 null,我应该抛出哪个异常? (我在想ObjectNotFoundException

【问题讨论】:

  • 如果使用唯一 ID 访问 - KeyNotFoundException

标签: c# .net entity-framework exception


【解决方案1】:

人们可能会争论是否需要例外;为什么不返回一个空集合或 null?

您应该使用的异常类型取决于您在应用程序中使用异常的方式。

您可能首先考虑的是它是功能错误(用户是否应该更正某些内容)还是技术错误(开发人员是否犯了错误)。

您应该考虑的另一件事是对于方法的调用者来说什么是自然的。

【讨论】:

  • +1 表示null 而不是例外
  • 为什么要抛出异常?嗯,这是因为从业务逻辑的角度来看,该记录应该存在,因为它代表特定案例的默认值。因此,如果它不存在,(服务器端)方法将无法继续 - 即使请求(来自 WCF 服务)。
  • 从业务角度来看,您永远不需要例外。从您的描述来看,这感觉像是一个不应该发生的技术错误。在这种情况下,您可以选择对调用者有意义的任何名称。顺便说一句,不要公开 WCF 的异常,而是公开 SOAP 错误。
  • “选择对调用者有意义的任何名称”是什么意思。您的意思是选择任何有意义的异常类型?
  • 是的,您可以选择现有的,但您也可以创建自定义异常。重要的是调用者了解正在发生的事情,以及在发生此异常时如何解决它。
【解决方案2】:

我不会为这种情况抛出异常,只需处理 null 返回值。开始使用异常来控制应用程序流并不是一个好主意。

如果实体应该肯定在那里,那么您可以处理业务层中的null 值并抛出自定义域异常,例如EntityNotFoundException,但是,我不会将这种逻辑放在存储库级别。

【讨论】:

  • 必须检查nulls 不会导致代码过于干净,因为如果没有找到返回null 的方法并不能清楚地表达意图。也许考虑返回一个Maybe<T>,它清楚地表示要返回的类型的onezero被退回。
  • 当您尝试测试此方法时,Null 也不会告诉您任何信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多