【问题标题】:Logical exception vs technical exception逻辑异常与技术异常
【发布时间】:2020-02-20 08:42:40
【问题描述】:

对于唯一字段 - 电子邮件,用户表中的数据库级别存在限制。也就是说,如果我们尝试使用现有电子邮件地址保存用户,则会发生 SQLServerException。在这种情况下,我们可以捕获这个技​​术异常,创建然后抛出我们自己的技术异常

但我们也可以向数据库发出请求并检查用户是否存在,然后抛出我们自己的逻辑异常

问题是哪个选项更可取?

【问题讨论】:

  • 技术和逻辑异常不是 java 类型,恐怕这个问题对我来说没有多大意义。但我想说的是,当您尝试插入已经存在的电子邮件时抛出异常是正常的。对于另一种情况(查询用户是否已经存在),我宁愿有一个返回布尔值而不是异常的方法
  • 技术和逻辑异常是异常的另一种分类。什么是逻辑异常? - 例如,用户输入了错误的值,结果我们得到一个负的余额值。按照我们的逻辑,余额不能为负数,应该抛出异常。
  • @Bentaye 逻辑异常也称为业务异常
  • @Nico 我很想知道你对这个案例的看法(使用 db 查询检查用户是否存在)这个例外是生意吗?
  • @alexis_druzik 是的,这是一个商业例外,您决定您的软件不允许用户注册两次。但是您可以选择允许一个用户注册多次(当然,对于用户体验来说,拥有多个具有相同电子邮件的帐户是没有意义的......而且由于其他原因也没有意义)。

标签: java exception


【解决方案1】:

这取决于你的要求

  1. 如果有 1 个选项,您需要对电子邮件字段进行约束。然后,在捕获异常时,您需要小心,这确实限制了电子邮件字段的违规行为。我在这里看到的唯一优势是您只需对 db 进行一次查询。

  2. 在第二种情况下,您拥有所有控制权,您可以显式检查电子邮件是否已经存在于单独的数据库查询中,如果不抛出异常,则进行附加查询以插入数据。 在这里,您必须进行 2 db 调用,但您可以更好地控制行为。

【讨论】:

    【解决方案2】:

    最好的做法是检查数据库,不要使用数据库的约束。

    必须将数据库约束视为确保数据完整性的第二道屏障。但它不能驱动你的业务逻辑。只有您的软件驱动您的业务逻辑。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 2016-07-01
      • 1970-01-01
      • 2012-04-23
      • 2011-09-02
      • 1970-01-01
      • 2012-12-19
      • 2017-09-19
      • 2019-01-18
      相关资源
      最近更新 更多