2013-10-14 88 views
2

異常的類型通常足以正確處理它(例如,您嘗試打開文件並獲得FileNotFoundException)。但是,有些情況下可能會捕獲同一類型的多個異常。例如,可能由多個參數引起的IllegalArgumentExceptionIllegalArgumentException不會向Throwable接口(根據在線javadoc)添加任何其他方法(或公用字段),這意味着您唯一可以信賴的信息是嵌套的異常(可能存在或可能不存在)以及消息(這是供人食用的)。以編程方式區分異常

我不喜歡延伸IllegalArgumentException來添加結構化信息的想法,因爲其他人將不得不學習新的類。而且我不喜歡亂拋垃圾的項目與非常具體的異常類。 使用消息字段也是一個壞主意,因爲它不適用於編程式訪問。

我認爲IllegalArgumentException應該包含詳細信息,例如有問題的類函數和參數。一般來說,自定義異常應該提供額外的細節(其他的只是它們的類型),以進行更細粒度的異常處理。

一般認爲設計異常類和處理同類異常的最佳實踐是什麼?

+0

你可以使用多個的try-catch塊,以確保你從右邊的代碼 – xmoex

+0

'嘗試{someFunction(ARG1,ARG2,ARG3)得到正確的除外; }'如果我得到由一個參數引起的IllegalArgumentException?我只有一個'嘗試' – Anthony

+0

我明白你的意思......也許你只是檢查參數,不要拋出異常? – xmoex

回答

5

作爲一般規則,我認爲它理想的是每個「調用者可能合理想要採取的動作類型」有一類異常。當然,對於自己的自定義異常,可能會有一個布爾值或枚舉字段提供一些額外的消歧,而不是創建簡單的子類。

在你的具體情況下,我不相信試圖處理異常是一個好主意。 RuntimeException及其子類通常代表編碼問題,IllegalArgumentException也是如此。如果論證不合法,則不應首先通過。

如果你處於不是的確實如果一個參數是有效的(也許是用戶輸入,或者你不知道你調用該方法的特定對象),那麼一個更好的方法是通過在通過它之前檢查參數的有效性。而不是說「做這個」並且抓住例外,問「我能做這個嗎?」打電話之前。

0

確實,預定義的異常類非常普遍。但是,如果您想要了解有關例外的更多具體細節,那麼您應該使用用戶定義的例外。你應該創建你自己的具有任何級別的細節的異常類!

這裏是僞代碼:

public class TooManyArguments extends exception{ 
    public String toString(){ 
    return ("..whatever information you want to give for this exception..")' 
    } 

}

,每當你遇到特殊情況,拋出此類

throw new TooManyArguments(); 
1

異常類應該被設計成的一個實例提供他們被抓到時所需的一切。請注意,try/catch語句實際上是一種類型切換,所以通常創建更多的異常類更清晰,而不是通過在catch子句中嵌套太多的if來混淆程序邏輯。

它必須說,catch子句都沒有,如果你想組織面向對象的方式錯誤處理代碼很方便,所以有不同的權衡牢記。

需要注意的是標準的異常類是有什麼一段代碼導致異常的可用信息,即使我不會建議你立足於它的錯誤處理邏輯。

如果當前異常被拋出到catch子句中的一個不同的異常,這應該可用於getCause()方法,而getStackTrace()應提供訪問拋出異常時處於活動狀態的調用堆棧。

再次,我不建議您使用這些信息,除了調試目的。