2015-04-15 72 views
0

我想捕獲一個SQLException,發送一些郵件然後發送異常到下一個目標。我子類如下:java:重新拋出被困異常

class myexception extends SQLException { 
    public myexception(Throwable cause) throws SQLException { 
     super(cause); 

     ... send mail ... 

     throw new SQLException(cause); 
    } 
} 

如果我裹着現有函數拋出的SQLException(「連接()」或者是之流):

public void somecall() throws myexception { 
    try { 
     ... SQL call ... 
    } catch(SQLException sqlException) { 
     throw new myexception(sqlException); 
    } 
} 

可我重新拋出原SQLException或者我需要解壓縮並創建一個新的? IE瀏覽器是我的類去生成運行時錯誤,當我打電話拋出新的SQLException(原因);

回答

4

有一個更清潔的方式做你正在嘗試的事情。

try { 
    sqlCall(); 
} catch (SQLExcetion e) { 
    sendMail(); 

    throw e; 
} 

你不需要子類SQLException

+0

優秀點。事後看來,這是更安全的。 (得到橡皮擦) - 開始(de)編碼的時間。 – ethrbunny

1

我不明白爲什麼它是不可能的,但你需要抓住的SQLException:

try{ 
    try{ 
     someCall(); 
    } 
    catch(myException e) { 

    } 
} 
catch(SQLException e) { 
    // catches the thrown SQLException 
    //created by new myException(Throwable clause) 
} 
1

在我看來,異常不應該被用來實現業務或框架邏輯(例如作爲「當我創建時發送電子郵件」)

實際的框架本身應該用來做到這一點。例如,如果您要管理所有軟件組件(例如spring的控制反轉(IoC)容器),並且每次發生特定的異常(例如發送電子郵件)時都要執行「某些事情」被拋出,你可以使用Aspect Orientated Programming技術。

使用這樣的聲明式構造,您可以針對某些方法並攔截引發SQLException的情況,然後執行您的邏輯。

在發送電子郵件的情況下,我會親自創建隊列或東西,所以我的主要代碼執行不舉起,同時電子郵件被髮送