我無法弄清楚爲什麼......拋出了2個異常,但我無法捕捉到它們。拋出異常但未捕獲
在一個庫中我有這段代碼引發2種不同的異常。
try {
statement = con.prepareStatement(query);
if (statement.executeUpdate() != 1) {
throw new InvalidIndexException("Record not found or not modified", query);
}
} catch (SQLException e) {
throw new DatabaseIOException(e, "", "SQL Error", logQuery);
}
該查詢被修改爲觸發SQL錯誤。當它發生時我有一個日誌條目:
2013-04-26 12:19:39 class database.DatabaseIOException
userManagement.Login.setActivationFlag(Login.java:473)
-> SQL Error
[QUERY]: UPDATE login SET activationprTTTTocess='false' WHERE id=235423432
[MSG]: ERROR: column "activationprttttocess" of relation "login" does not exis
所以我敢肯定的是,SQLERROR已經被捕獲,並重新拋出DatabaseIOException,我跟着執行代碼在調試模式下使用Netbeans了。所有現在都適合。
現在我有一個servlet,我嘗試激活一個用戶:
try{
Login.setActivationFlag(235423432, false);
} catch (DatabaseIOException db) {
Log.addItem(db.getMessage());
} catch (InvalidIndexException ed){
Log.addItem(ed.getMessage());
}
Wathewer我試試有沒有辦法在任何catch塊進入。當執行Login.setActivationFlag行時,日誌中會顯示錯誤(如上所示),但catch塊會像沒有任何內容一樣被跳過。
我想不通爲什麼這個怪異的行爲。我使用這些例外,因爲3年沒有任何問題... 這個代碼肯定有一些東西是我看不到的,真的很愚蠢......
那麼,如何能有人幫助? – 2013-04-26 22:28:14
主要取決於搜索關鍵字。這個錯誤相當臭名昭着,但很難察覺。我修改了標題,希望這會更具代表性。 – Azathoth 2013-04-27 07:50:29
問題是您沒有包含任何可以幫助診斷問題的代碼。我認爲,如果代碼拋出一個異常,finally代碼塊的返回無關緊要,那麼您的解決方案沒有任何意義,但異常仍然會被拋出,並且可以被捕獲。 – 2013-04-27 15:19:35