【问题标题】:All RuntimeException / Un-checked exception advocates, how would you handle this scenario?所有 RuntimeException / Un-checked exception 倡导者,您将如何处理这种情况?
【发布时间】:2012-05-30 17:03:23
【问题描述】:

场景:

对于需要根据用户 ID 进行注册的网站,用户 ID 必须是唯一的。假设用户尝试使用“foo”用户 ID 注册,该用户 ID 已经存在(带有其他必填字段)。现在,不使用受检异常(数据库 API 将抛出 SQLException 重复插入),我想知道未受检异常的拥护者如何处理这种情况并告知用户 id 已被选择?

假设这个网站是在 Struts 上的(不不,我不是在做一个项目,只是我更了解它)。用户将填写的信息提交给调用 DAO 插入新记录的 Struts Action。因此,最终,DAO 将发出 INSERT 语句,该语句将失败。因此,如果 Action(调用 DAO)没有显式处理这种情况(DAO 方法可能只是声明它抛出 SQLException 或方法可能会捕获 SQLException 并抛出一个业务检查异常,例如扩展异常的 DuplicateUserIDExceptoion),怎么能这会用未经检查的异常处理吗?

底线 - 我读了很多文章,说明 Java 不需要检查异常,所以,我希望这个场景能帮助我更好地理解它。请不要指向文章,因为我已经阅读了很多很多,我真的很困惑。您可以帮助我的最佳方式是提供上述方案的答案。

注意:我确实理解任何可恢复的异常情况都必须由已检查异常(我一直在我的项目中实现)处理,但是,我真的被未检查异常的拥护者弄糊涂了。你们是如何处理上述情况的?

提前致谢。

【问题讨论】:

    标签: java exception-handling runtimeexception unchecked


    【解决方案1】:

    未检查的异常可以像检查的异常一样被捕获。我会使用以下方法来处理这种情况:

    1. 检查用户 ID 是否已经存在。如果是这样,抛出一个检查过的 DuplicateUserIdException。我认为检查异常在这里更有意义。但是您也可以将异常设置为运行时异常,并在表示层中捕获它,就像捕获已检查的异常一样
    2. 插入用户。如果发生 SQLException,则根本不容易确定它正是由于已经存在的用户 ID。另外,如果延迟,可以在提交时检查约束。这种异常只会在两个线程之间出现竞争条件的情况下发生,因此应该很少见。因此,我会将其视为技术运行时异常并显示一般错误消息。

    【讨论】:

    • 大多数 DB 抽象框架会为您将特定于供应商的错误转换为类型化异常,因此我可能会跳过查询。
    • 如果约束被延迟怎么办?如果该过程涉及在 8 个表中插入 100 行怎么办?如何知道哪个插入导致了 ConstraintViolationException,以及违反了哪个约束?
    • 将流程分成两个事务:一个做最少的工作来创建具有请求 ID 的用户,另一个构建相关信息。
    • 然后你把 ACIDity 扔出窗外。不,谢谢。我更喜欢我的数据库包含一致的数据。
    • 如果您不能将该操作拆分为两个有效事务,那么您当然会被卡住。但是,我们在这里讨论的是注册用户。这通常不需要创建订单或信用卡或历史记录或随着时间的推移附加到用户的无数其他东西。它需要users 表中的一行。
    【解决方案2】:

    如何启动事务,查询数据库以检查 id 是否存在,如果不存在,执行插入,然后提交事务?如果确实存在,则告诉用户该 id 已经存在。更好的是,您可以将表单中用户名字段的模糊检查作为 ajax 请求,并向他们表明它已经被占用。为什么要依赖数据库异常来判断id是否存在?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多