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")){
 }

特に安全です。例外メッセージが null (!) になることはないと想定してから、例外メッセージで比較を実行します。特定のクラスの例外をキャッチしたい

   catch (SQLException e)

クラス自体をフィルタリングします。データベースから返されたエラー コードを利用することもできます。これらはデータベース ベンダー固有のものです。詳細と特にメソッドについては、 SQLExceptiongetErrorCode() doc を参照してください(実際にここでキャッチしていると思いますSQLExceptionsが、原則はより広いです)

他のコメント。例外処理の外側とブロック内で、結果セット/ステートメント/接続を閉じる必要がありますfinally。例外/成功に関係なく、これらのリソースを解放する必要があります。これを安全かつ簡潔に行うには、DBUtils.closeQuietly()を確認してください。

于 2013-03-08T09:56:21.657 に答える