2

我正在尝试将一些数据插入到名为rmas.

表格格式为

|rcode|rname|vcode|vanme

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

当我使用现有 rcode 插入记录时,它会显示类似ORA-0000-1 唯一约束 Violated ..

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

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

因此,我只想捕获该主键异常并显示为“rcode 已存在”。可能吗?如果是,那么如何?

提前致谢

4

5 回答 5

8

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
}

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

于 2013-02-14T12:10:12.083 回答
1

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

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

为什么要在 servlet 上执行此操作让我无法理解,但我建议您查看解决方案的体系结构并提供分层方法,在持久层中捕获此异常并返回您自己的结果代码,它定义了哪个消息应该显示给用户。

注意:我使用结果代码而不是错误代码来允许返回成功操作的代码。

于 2013-02-14T12:05:39.023 回答
0

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

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

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

于 2013-02-14T12:05:58.490 回答
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();
}

希望简单实用!!

于 2020-02-09T13:40:25.733 回答
0

在我的 Spring Boot 应用程序中,我使用DataIntegrityViolationException来捕获这样的唯一约束:

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

}
于 2019-06-04T22:47:13.820 回答