我在数据库中有一个带有唯一约束的列"name“。我正在尝试处理数据库异常,捕捉它,并返回用户友好的消息给用户。
问题出在异常类型上。异常的原因是
org.postgresql.util.PSQLException但是当我得到异常(最大的异常是javax.ejb.EJBTransactionRolledbackException)时,它不能被识别为PSQLException。
在一些研究之后,我发现了这一点,并试图解释为什么我得不到"PSQLException“,所以我放了一个这样的代码:
//code with saving row to database
} catch (javax.ejb.EJBTransactionRolledbackException e) {
try {
int a = ((PSQLException)TisUtil.getRootError(e)).getErrorCode();
addMessageWarn("That name already exists");
} catch (Exception ex) {
addmessageError(ex);
}
} 我们的目标是了解为什么Java不能捕获PSQLException。因此,程序进入EJBTransactionRolledbackException一节。GetRootError方法找到了PSQLException的根本原因,但它无法对其进行强制转换。
Exception ex看起来像这样:
ClassCastException", detailMessage: "org.postgresql.util.PSQLException cannot be cast to org.postgresql.util.PSQLException".我用的是Jboss,wildfly 8.0,Persistance 2.0,PostgreSQL。
发布于 2014-12-16 22:40:11
看起来您可能正在使用JTA或EJB3事务管理。
这在JDBC异常之上定义了一个层。您无法捕获JDBC异常,因为它们是由EJB3异常包装的。要了解更多信息,请阅读EJB3、JTA和EJB事务。
您必须解包并检查异常,这是Java非常不擅长的。像Apache ExceptionUtils这样的工具提供了很多帮助,因为它们可以沿着异常树查找特定的异常类。
不能保证任何PSQLException都是根;可能会有一个java套接字异常或其他东西作为根,并用一个PSQLException包装它。
https://stackoverflow.com/questions/27503766
复制相似问题