2013-04-26 109 views
1

我無法弄清楚爲什麼......拋出了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年沒有任何問題... 這個代碼肯定有一些東西是我看不到的,真的很愚蠢......

回答

-1

經過大約4個小時的調試後,我發現它是什麼:在處理異常時要做的更糟糕的事情。

setActivationFlag()回報說法是沒有道理的......它在下跌finally塊

... 
    } finally { 
     ... 
     return done; 
    } 
} 

代替

... 
    } finally { 
     ... 
    } 
    return done; 
} 

編輯: 這一段代碼來測試

public void ExceptionTest() throws Exception { 
    try { 
     Integer test = null; 
     test.toString(); 
    } catch (NullPointerException e) { 
     out.println("Catched inner NullPointerException"); 
      throw new Exception("My Exception", e); 
    } finally { 
     return; 
    } 
} 

public void test() { 
    try { 
     ExceptionTest(); 
    } catch (Exception outer) { 
     out.println("Catched: " + outer.getMessage()); 
    } 
} 

隨着在最後回報聲明外的例外是永遠抓住。

+0

那麼,如何能有人幫助? – 2013-04-26 22:28:14

+0

主要取決於搜索關鍵字。這個錯誤相當臭名昭着,但很難察覺。我修改了標題,希望這會更具代表性。 – Azathoth 2013-04-27 07:50:29

+1

問題是您沒有包含任何可以幫助診斷問題的代碼。我認爲,如果代碼拋出一個異常,finally代碼塊的返回無關緊要,那麼您的解決方案沒有任何意義,但異常仍然會被拋出,並且可以被捕獲。 – 2013-04-27 15:19:35

-1

你是否捕捉到相同類型的DatabaseIOException?如果在具有相同名稱的不同名稱空間中存在異常,並且通過導入該類自動完成「幫助」,則會得到您描述的行爲。

+0

不,我也檢查過,導入的類是正確的 – Azathoth 2013-04-26 11:44:44