java - 捕获有意义的 sql 异常的正确方法

标签 java sql postgresql exception jdbc

在我的 java try - catch 子句中,我希望能够捕获 sql 异常的确切原因(我使用的是 Postgres,但这个问题适用于所有 jdbc 驱动程序)。我要做的是

} catch (Throwable ex) {
        // Rollback only
        ex.printStackTrace();
        String message = ex.getMessage();
        Throwable cause = ex.getCause();
        if (cause instanceof ConstraintViolationException){
            SQLException exc = ((ConstraintViolationException)cause).getSQLException();
            if (exc instanceof BatchUpdateException){
                SQLException nextEx = ((BatchUpdateException)exc).getNextException();
                if (nextEx instanceof PSQLException){
                    message = ((PSQLException)nextEx).getMessage();
                }
            }
        }
        throw new RecordServiceException(message); 
    }

这太糟糕了,并且只适用于非常特定类型的异常。有没有更普遍有效的方法来捕获有意义的 sql 异常?

最佳答案

来自 Oracle 文档:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqlexception.html

public static void printSQLException(SQLException ex) {

    for (Throwable e : ex) {
        if (e instanceof SQLException) {
            if (ignoreSQLException(
                ((SQLException)e).
                getSQLState()) == false) {

                e.printStackTrace(System.err);
                System.err.println("SQLState: " +
                    ((SQLException)e).getSQLState());

                System.err.println("Error Code: " +
                    ((SQLException)e).getErrorCode());

                System.err.println("Message: " + e.getMessage());

                Throwable t = ex.getCause();
                while(t != null) {
                    System.out.println("Cause: " + t);
                    t = t.getCause();
                }
            }
        }
    }
}

关于java - 捕获有意义的 sql 异常的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584087/

相关文章:

java - Drools Salience 的最大值和最小值是多少

java - 无法使用通配符泛型类型向 Java 集合添加值

mysql - 将图像添加到sql服务器

java - 如何使用 postman 在keycloak中添加新用户?

java - 带有 ListenerPort 的 V5 消息传递提供程序

php - 将图像链接到标签并使用复选框选择哪些标签

sql - 查找特定索引属于哪个表

database - PostgreSQL 文件处理和目录

node.js - 如何使用 pg-promise 在没有密码的情况下连接到 Postgres 数据库?

json - 在 postgresql 查询中展平 jsonb 对象的更好方法是什么