2013-01-06 37 views
-2

我已經做了類,這是自定義的異常類,它包含了許多重載方法關於捕獲它

public class abcException extends Exception 
{} 

我有我導入上述abcException類也

import com.system.error.abcException; 
class fgh 
{ 

void dhj() throws abcException //method that might throw Exception 
{ 
try 

{ 
} 
catch(Exception bse) { 
     log.logError(bse.getMessage(), bse); 
     throw new abcException(bse.getMessage(), bse); 
} 
} 
另一個類後拋出異常

現在我的查詢是如上面的類所示,它包含一個名爲dhj()的方法,其中 可能會拋出一個自定義異常,但爲什麼在catch塊中我們再次拋出異常後記錄 這是正確的做法嗎?請告知,請告知是否可以有這樣的事情

+0

蟎?或者可能? –

回答

1

如果您使用的是throws子句,您不需要在同一個方法中再次捕獲它,那麼使用該方法的客戶端應該明確地處理該異常,它在throws子句中,在某個時間點有人應該處理該異常,否則代碼將無法編譯。在這種情況下,我認爲catch和throw是多餘的

2

這樣的做法是可以接受的。當您創建可與SQLite和/或MySQL一起使用的數據庫驅動程序時,請考慮一個示例。你的類的公共API有一個方法connect()。讓我們考慮一下,當連接參數錯誤導致無法建立連接時,您需要處理這種情況。在這裏你有SQLite和MySQL的工作方式之間的根本區別。 SQLite是基於文件的,你可能會抓到例如FileNotFoundException,而MySQL則通過網絡訪問,您可以獲得ConnectException。公共API用戶不想知道你的驅動程序深處發生了什麼,因此你只需將這些例外包含在MyDbDriverConnectException中,這樣更方便處理。

UPD:對於異常日誌記錄,日誌記錄和重新拋出是不好的做法,因爲您創建了多次記錄一個異常的情況。閱讀this great post瞭解更多信息。

+0

爲了補充說明,當您將常規自定義異常包裝爲異常時,客戶端現在只需處理該常見異常,而不是處理被調用方法中拋出的衆多特定異常。因此它減少了在客戶端處理的例外數量。 –

+0

@Andrey請告知是否可以有這樣的事情 – user1924563

+0

@ user1924563至於重新拋出之前的日誌記錄 - 這是不好的,因爲你可以創建一個情況,當你有一個異常記錄多次。但是_rethrowing_一般來說沒問題。 –

0

在例外

的情況下
  1. 抓它,記錄它。 或
  2. 把它

永遠不能登錄並重新拋出同樣的異常。

對於例如:在Java servlet爲,servlet的方法允許拋出唯一的ServletException或IOException異常

所以,如果你的邏輯發生其他異常時,您包裝該異常的的ServletException並重新拋出它。但是緩存Exception被不好,並表明你不知道你在這個方法中做了什麼。這甚至會捕獲在大多數情況下不應該被捕獲的RuntimeException。

0

日誌和罰球往往被認爲是一種反模式,見http://today.java.net/article/2006/04/04/exception-handling-antipatterns#logAndThrow

catch (Exception e)通常是不好的,因爲這樣一來,你趕它不應該被抓住RuntimeExceptions。通常我們只捕獲檢查的異常。需要注意的是Java 7中具有multicatch功能catch(FirstException | SecondException e)

爲捕獲並重新拋出它的美好,它是例外translaction,看到http://www.javapractices.com/topic/TopicAction.do?Id=120

+0

請告知是否可以有這樣的事情 – user1924563