Servlet捕获唯一约束异常

时间:2013-02-14 12:01:51

标签: java oracle exception servlets unique-constraint

我正在尝试将一些数据插入名为rmas的表中。

表格格式为

|rcode|rname|vcode|vanme

在这里,我为rcode设置了主键。

当我使用现有的rcode插入记录时,会显示 ORA-0000-1唯一约束违反 ..

如果我使用以下代码,即使出现其他错误,也会显示该消息。

catch(Exception e)
{
 //out.println("rcode already exists");
}

所以,我想仅捕获该主键异常并显示为“rcode已存在”。可能吗?如果是,那怎么办?

提前致谢

5 个答案:

答案 0 :(得分:6)

Exception是所有异常的父级。如果您已编写catch(Exception e) { }块,则所有例外都将属于此类别。您需要找到编译器返回的异常。假设您的编译器返回此异常SQLIntegrityConstraintViolationException,那么将会出现以下块

catch(SQLIntegrityConstraintViolationException e) 
{
  // Error message for integrity constraint violation
}
catch(NullPointerException e)
{
  // Null Pointer exception occured.
}
catch(Exception e)
{
 // Other error messages
}

通过这种方式,您可以拥有任意数量的异常块。但要确保首先编写更具体的异常类型,然后再写出父异常

答案 1 :(得分:1)

您正在捕获Exception,这是所有异常的超类。通过捕捉这个你使用神奇宝贝风格(“要抓住他们所有!”),这通常是一种不好的做法,因为你失去了根据在该区块中抛出的特定异常采取不同行动的能力。代码。

仅捕获与约束违规相关的异常,以避免显示每个异常的消息。

为什么要在servlet上执行此操作,但我建议您查看解决方案的体系结构并提供分层方法,在 Persistence tier 中捕获此异常,返回您自己的结果代码,用于定义应向用户显示的消息。

注意:我使用结果代码而非错误代码以允许返回代码以便成功运行。

答案 2 :(得分:0)

我不会在servlet中有任何这样的代码。我认为它属于一个存在于持久层中的类。 Servlet是HTTP侦听器;他们不应该有数据库代码。

让基于接口的持久性类捕获该异常并适当地处理它。编写一个使用持久性类来实现用例的基于接口的服务。让servlet根据发生的情况调用服务并找出接下来要显示的内容。

它被称为分层架构。我推荐它。

答案 3 :(得分:0)

在我的Spring Boot应用程序中,我使用 DataIntegrityViolationException 来捕获唯一的约束,如下所示:

try {
    userRepository.save(user);
    log.debug("Created Information for User: {}", user);
} catch (DataIntegrityViolationException e) {

}

答案 4 :(得分:0)

我将以以下方式捕获:

catch(Exception ex){
      if(ex.getMessage().contains("UNIQUE KEY"))
           return "Error - Unique Key Violation!!";
      else if(ex.getMessage().contains("FOREIGN KEY"))
           return "Error - Foreign Key Violation!!";
      else
          return "Other Error: " + ex.getMessage();
}

希望它既简单又实用!