在JAVA中捕获SQL错误?

时间:2015-08-26 15:58:25

标签: java sql oracle try-catch

我在SQL Java中获得了Oracle DB个结果集,我想知道是否以及如何在Java中记录/捕获SQL错误。所以当我尝试执行一些SQL时:

ResultSet resultSet = connection.executeQuery(query);

我收到ORA-00942: table or view does not exist之类的错误。我怎么能记录下来?

3 个答案:

答案 0 :(得分:4)

使用catch语句根据需要存储正确的SQL异常:

try (ResultSet rs = statement.executeQuery(query)) {
    /* retrieve the data */
} catch (SQLException e) {
    /* handle the exception properly */
    storeExceptionSomewhereElse(e);
}

//...

public void storeExceptionSomewhereElse(SQLException e) {
    /*
        Here you can store the exception in database
        or external data source.
    */
}

答案 1 :(得分:0)

如果你想要一个更强大的解决方案并且会记录executeQuery的每个异常,通过实现所述接口,然后代理对真实连接对象的调用,为Connection和Statement创建包装类。更改用于获取连接的逻辑,并将原始连接作为construtor争论传递。像这样:

public class WrapperConnection implements java.sql.Connection {
    public Connection _realConn;

    public WrapperConnection(Connection realConnection) {
        _realConn = realConnection;
    }

    @Override
    public Statement createStatement() throws SQLException {
        return new WrapperStatement(_realConn.createStatement());
    }

    ...lots of other implmented proxy methods...
}

和Statement对象:

public class WrapperStatement implements Statement {

    public Statement _realStmt;

    public WrapperStatement(Statement realStmt) {
        _realStmt = realStmt;
    }

    @Override
    public ResultSet executeQuery(String sql) throws SQLException {
        try {
            return _realStmt.executeQuery(sql);
        } catch(SQLException sqlEx) {
            logSQLException(sqlEx);
            throw sqlEx;
        }
    }

    ...lots of other implemented proxy calls...

}

繁琐的部分是你必须在接口中实现所有其他调用,但它们非常简单,基本上将每次调用代理传递给传递给构造函数的“真实”对象;然后,这将使您有机会记录每种类型的调用(获取准备调用等)。您还可以使用它来记录通过executeQuery()执行的SQL,并将其与异常相关联扔了。

答案 2 :(得分:0)

您可以使用try-catch来获取错误。然后,您可以设置记录器来记录异常。

例如:

catch(SqlException e){
     Logger.LogDB("Record1: "+ e);
}