所有RuntimeException / Un-checked异常提倡者,您将如何处理这种情况?

时间:2012-05-30 17:03:23

标签: java exception-handling runtimeexception unchecked

情景:

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

让我们说这个网站是关于Struts的(不,不,我不是在做一个项目,只是我更了解它)。用户向Struts Action提交填充信息,Struts Action调用DAO以插入新记录。因此,最终,DAO将发出INSERT语句,该语句将失败。因此,如果Action(调用DAO)没有显式处理这种情况(DAO方法可能只是声明它抛出SQLException或者方法可能会捕获SQLException并抛出像DuplicateUserIDExceptoion这样的业务检查异常,从而扩展了Exception ),如何处理未经检查的异常?

底线 - 我读过许多文章,声明Java不需要检查异常,所以,这个场景将帮助我更好地理解它,我希望如此。请不要指向文章,因为我读了很多很多,而且我真的很困惑。您可以帮助我的最好方法是回答上述情况。

注意:我确实理解任何可恢复的异常情况必须由一个已检查的异常处理(我已经在我的项目中实现)但是,我真的很困惑的是未经检查的异常ONLY倡导者。你们如何处理上述情况?

提前致谢。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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