【问题标题】:Servlet catch unique constraint exceptionServlet 捕获唯一约束异常
【发布时间】:2013-02-14 12:01:51
【问题描述】:

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

表格格式为

|rcode|rname|vcode|vanme

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

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

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

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

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

提前致谢

【问题讨论】:

  • 查看你的编译器,它会抛出哪个异常。我的意思是异常类型

标签: java oracle exception servlets unique-constraint


【解决方案1】:

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
}

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

【讨论】:

  • 看编译器喊出的 EXCEPTION 类型
  • 它会抛出java.sql.BatchUpdateException
【解决方案2】:

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

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

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

注意:我使用 Result code 而不是 Error code 来允许返回成功操作的代码。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我会通过以下方式捕捉:

        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();
        }
        

        希望它既简单又实用!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-05
          • 2011-04-17
          相关资源
          最近更新 更多