我在数据库中有一个具有唯一约束的列“名称”。我正在尝试处理数据库异常,捕获它,并将用户友好的消息返回给用户。
问题在于异常类型。异常的原因是
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
的根本原因,但它无法投射它。
例外ex看起来像这样:
ClassCastException", detailMessage: "org.postgresql.util.PSQLException cannot be cast to org.postgresql.util.PSQLException".
我正在使用Jboss,wildfly 8.0,Persistance 2.0,PostgreSQL。
答案 0 :(得分:0)
看起来您可能正在使用JTA或EJB3事务管理。
这在JDBC异常之上定义了一个层。您无法捕获JDBC异常,因为它们被EJB3异常包装。要了解更多信息,请阅读EJB3,JTA和EJB事务。
你必须解开并检查异常,这是Java特别可怕的。像Apache ExceptionUtils这样的工具可以提供很多帮助,因为它们可以沿着异常树向下查找特定的异常类。
无法保证任何PSQLException
是根;可能有一个java套接字异常或者某个东西作为root和PSQLException包装它。