2013-03-08 56 views
0

我有這樣的代碼。避免Java中的特定異常

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發生錯誤」的異常。但我想記錄以外的這個異常。我的代碼有什麼問題。 感謝

+2

'避免'與'忽略'不同! – codeMan 2013-03-08 09:54:16

+0

什麼不工作? – vikingsteve 2013-03-08 09:54:57

+1

我不知道。哪裏不對 ?例外等? – 2013-03-08 09:54:58

回答

2

我不認爲

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

是特別安全。您假定異常消息不會爲空(!),然後對異常消息執行比較。我寧願捕捉特定類別的例外情況,例如

catch (SQLException e) 

和過濾器類本身。您也可以使用數據庫返回的錯誤代碼。這些是數據庫供應商特定的,注意。有關詳細信息,請參見SQLException文檔,特別是getErrorCode()方法(我假設您在此處實際上捕獲了SQLExceptions,但原理更寬)

其他評論。您應該在異常處理之外並在finally塊中關閉結果集/語句/連接。您需要釋放這些資源而不管的例外/成功。也許檢查出DBUtils.closeQuietly()安全和簡潔地做到這一點。