我正在尝试将一些数据插入名为rmas
的表中。
表格格式为
|rcode|rname|vcode|vanme
在这里,我为rcode设置了主键。
当我使用现有的rcode插入记录时,会显示 ORA-0000-1唯一约束违反 ..
如果我使用以下代码,即使出现其他错误,也会显示该消息。
catch(Exception e)
{
//out.println("rcode already exists");
}
所以,我想仅捕获该主键异常并显示为“rcode已存在”。可能吗?如果是,那怎么办?
提前致谢
答案 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();
}
希望它既简单又实用!