Java Servlet捕获唯一约束异常
我正在尝试向名为Java Servlet捕获唯一约束异常,java,oracle,exception,servlets,unique-constraint,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 ready exist”。可能
rmas
的表中插入一些数据
表格格式为
|rcode|rname|vcode|vanme
在这里,我为rcode设置主键
当我插入带有现有rcode的记录时,它会显示类似于违反了ORA-0000-1唯一约束的内容
如果我使用以下代码,即使在出现其他错误的情况下,它也会显示消息
catch(Exception e)
{
//out.println("rcode already exists");
}
所以,我只想捕获主键异常并显示为“rcode ready exist”。可能吗?如果是的话,怎么办
提前感谢您正在捕获一个
异常
,它是所有异常的超类。通过捕捉这一点,您可以使用神奇宝贝风格(“要捕捉所有人!”),这通常是一种糟糕的做法,因为您无法根据代码块中抛出的特定异常采取不同的行动
仅捕获与约束冲突相关的异常,以避免显示每个异常的消息
我不明白为什么要在servlet上执行此操作,但我建议您查看解决方案的体系结构,并提供分层方法,在持久性层捕获此异常并返回您自己的结果代码,该代码定义应向用户显示的消息
注意:我使用结果代码而不是错误代码来允许返回成功操作的代码。在servlet中不会有任何这样的代码。我认为它属于一个生活在持久层中的类。servlet是HTTP侦听器;它们不应该包含数据库代码 让您的基于接口的持久性类捕获该异常并适当地处理它。编写一个基于接口的服务,该服务使用持久性类来完成用例。让servlet调用服务,并根据发生的情况确定下一步要显示什么
它被称为分层体系结构。我强烈推荐它。
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
}
通过这种方式,您可以拥有任意数量的异常块。但要确保先编写更具体的异常类型,然后编写父异常在我的spring boot应用程序中,我使用了DataIntegrityViolationException来捕获这样的唯一约束:
try {
userRepository.save(user);
log.debug("Created Information for User: {}", user);
} catch (DataIntegrityViolationException e) {
}
我将以以下方式捕捉:
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();
}
希望它简单实用 看看您的编译器,它会抛出哪个异常。我的意思是异常类型查看编译器它应该的异常类型它会抛出
java.sql.BatchUpdateException