Java 玻璃鱼中的陷阱异常

Java 玻璃鱼中的陷阱异常,java,mysql,jakarta-ee,glassfish,Java,Mysql,Jakarta Ee,Glassfish,到目前为止,我已经避免了捕获特定MySQL异常的问题,例如MySQLIntegrityConstraintViolationException,但现在我需要它来告诉用户他违反了约束,应该选择不同的字符串键。我尝试使用instanceof操作符捕获特定异常,因为Glassfish将其包装在EJBException中。但到目前为止我还没有做到这一点 是否有人拥有正确的代码/模式来捕获应用程序容器中作为Glassfish的特定SQL异常 向克里斯问好 另外,我正在使用Glassfish 3.1和JPA

到目前为止,我已经避免了捕获特定MySQL异常的问题,例如
MySQLIntegrityConstraintViolationException
,但现在我需要它来告诉用户他违反了约束,应该选择不同的字符串键。我尝试使用
instanceof
操作符捕获特定异常,因为Glassfish将其包装在
EJBException
中。但到目前为止我还没有做到这一点

是否有人拥有正确的代码/模式来捕获应用程序容器中作为Glassfish的特定SQL异常

向克里斯问好


另外,我正在使用Glassfish 3.1和JPA 2.0,对大多数数据库访问框架、库或API来说,不可能预测所有可能导致失败的场景

在JPA中,API中存在映射到常见故障的异常。大多数异常都是类的实例,或者是类的子类,比如,等等。您可以捕获这些特定的异常并发出相应的错误消息


您还可以使用,在持久化JPA实体之前验证它们的状态,以便减少捕获异常的可能性,这些异常需要不同的错误消息和最终用户的纠正措施。

您使用JPA吗?还是其他框架/库/API?@Vinet Reynolds:我用持久性库信息更新了帖子。如果违反了约束,持久性API中的任何标准异常(如果我理解正确的话)都不会被忽略。我以前总可以做一次查找/检查。但是我想尽量避免对数据库进行大量额外的查询,比如验证约束的错误代码。我将稍后再试。谢谢您的重播。@Chris,这取决于您定义的约束
EntityExistsException
将始终因主键冲突而引发。如果定义了其他约束,则可能仍然会抛出
PersistenceException
,其原因可能是
SQLException
。只要您知道SQL错误代码和应用程序中已违反的条件之间的映射,您仍然可以继续生成最终用户可以读取的消息。它不是主键或外键,只是唯一的约束。那么EntityExistsException会被抛出吗?@Chris,不会的。我相信在这种情况下会抛出PersistenceException。您需要使用
getCause()
方法递归异常堆栈,直到到达SQLException实例。然后,您可能能够将SQLError代码映射到人类可读的消息。