2012-05-30 14 views
0

场景:所有RuntimeException /未检查异常提倡者,你将如何处理这种情况?

对于需要基于用户标识注册的网站,用户标识必须是唯一的。比方说,用户试图注册'foo'用户标识,该用户标识已存在(以及其他必填字段)。现在,如果没有使用检查的异常(数据库API将抛出重复插入的SQLException),我想知道未经检查的异常的提倡者如何处理这种情况并向用户暗示该id已被选中?假设这个网站在Struts上(不,不,我不是在一个项目上工作,这只是我对它的理解)。用户将填充的信息提交给调用DAO插入新记录的Struts Action。所以,最终,DAO将发出INSERT语句,这将失败。因此,如果Action(调用DAO)没有明确处理这种情况(DAO方法可能会声明它抛出SQLException或方法可能捕获SQLException并抛出一个业务检查异常,如扩展Exception的DuplicateUserIDExceptoion),如何处理未经检查的异常?底线 - 我读了很多文章,指出Java不需要检查异常,所以,这种情况会帮助我更好地理解它,我希望。请不要指向文章,因为我读了很多很多,我真的很困惑。您可以帮助我的最佳方式是为上述情况提供答案。

注意:我明白,任何可恢复的异常情况都必须通过检查异常(我一直在我的项目中实现)来处理,但是,我真的很困惑未经检查的异常只倡导。你们如何处理上述情况?

在此先感谢。

回答

0

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

+0

请参阅我的意见以回答JB Nizet ... – user1418717

4

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

  1. 检查用户标识是否已经存在。如果是这样,抛出一个检查DuplicateUserIdException。我认为检查的异常在这里更有意义。但是,您也可以将例外作为运行时异常,并在表示层捕获它,因为您将捕获检查的异常
  2. 插入用户。如果发生SQLException,确定这正是由于已存在的用户标识,这并不容易。另外,如果推迟,可以在提交时检查约束。这种异常只会发生在两个线程之间的竞争条件的情况下,因此应该很少。所以我会把它当作技术运行时异常来处理,并显示一个通用的错误消息。
+0

大多数数据库抽象框架将供应商特定的错误转换为类型例外,因此我可能会跳过查询。 –

+0

如果约束被推迟呢?如果该过程涉及在8个表格中插入100行,该怎么办?你怎么知道哪个插入会导致ConstraintViolationException,以及违反了哪个约束? –

+0

将这个过程分成两个事务:一个做最小的工作来创建具有所请求的ID的用户,另一个创建相关信息。 –

相关问题