0

我有这样的代码。

try {
        st = Session.getDbConnection().createStatement();
        delSt = Session.getDbConnection().createStatement();
        rs = st.executeQuery("SELECT msg_id,message,mobile_no FROM sms");

        while (rs.next()) {   
            delSt.executeUpdate("DELETE FROM sms WHERE msg_id = '" + rs.getString(1) + "'");

            System.out.println("Message sent");
        }
        Session.getDbConnection().commit();


    } catch (Exception ex) {
        if (ex.getMessage().startsWith("error occurred at recursive")){
        }
        else{
            logger.error(ex.getMessage(), ex);
        }
        try {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
            if (delSt != null) {
                delSt.close();
            }

        } catch (Exception ex1) {
            logger.error(ex1.getMessage(), ex1);
            ex1.printStackTrace();
        }
        try {
            if (!Session.getDbConnection().isClosed()) {
                Session.getDbConnection().close();
            }
        } catch (Exception ex1) {
            logger.error("ERROR:Closing Database Connection:" + ex.getMessage(), ex);
        }

    } finally {
    }

现在在这种情况下,我想忽略/避免日志的异常“错误发生在递归 SQL 级别 1”。但我想记录除此异常之外的其他内容。我的代码有什么问题。谢谢

4

1 回答 1

2

我不认为

 if (ex.getMessage().startsWith("error occurred at recursive")){
 }

特别安全。您假设异常消息永远不会为空(!),然后对异常消息执行比较。我宁愿捕获特定类别的异常,例如

   catch (SQLException e)

并过滤类本身。您还可以使用数据库返回的错误代码。请注意,这些是特定于数据库供应商的。有关更多详细信息,特别是方法,请参阅SQLExceptiongetErrorCode()文档(我假设您实际上SQLExceptions在这里捕捉到了,但原理更广泛)

其他的建议。您应该在异常处理之外和您的finally块中关闭结果集/语句/连接。无论异常/成功如何,您都需要释放这些资源。也许查看DBUtils.closeQuietly()以安全简洁地执行此操作。

于 2013-03-08T09:56:21.657 回答