2011-03-12 40 views

回答

10

該規則應該更好的閱讀:不要處理你不知道如何處理的異常!

如果例如你編寫了一個讀取CSV文件並返回行標記的類,在你的類中可能會出現一些可能拋出IOException的點。你絕對不應該接受它,因爲處理它不是你的責任!您的任務是將字節流轉換爲令牌流,僅此而已。如果有人通過腐敗的流向你,這應該由他來處理,而不是你。

編輯另一個例子:如果你的庫例如達到一個SocketException,並且套接字已經從調用者提供給lib,則傳遞SocketException。如果你的庫只是一個抽象的連接框架,它也可以連接到文件,內存等,並且SocketExceptions不常見,將它們包裝在一個ConnectionException中。

+3

布洛赫並沒有說「不要拋出異常」,他說「拋出適合抽象的異常」。 – 2011-03-12 19:17:08

+0

@Software Monkey:+1,你說的對,一秒鐘閱讀我剛剛舉了一個例子來說明他的說法。 – Daniel 2011-03-12 20:10:24

2

它更加面向對象,隱藏實現細節。

正如約書亞說布洛赫有效的Java:

這是令人不安的,當一個方法 拋出了到 要執行的任務沒有 明顯的連接異常。當 方法通過較低級別的抽象傳播 拋出的異常時,通常會發生這種情況。不僅 這是令人不安的,但它污染 更高層的API與 實施細節。如果在後續版本中更高層 的實現發生變化,則拋出的異常也會更改 ,這可能會破壞現有的 客戶端程序。爲了避免這個問題,高層應該捕獲更低層次的異常,並且在他們的 位置拋出異常,這些異常可能是由更高級別的 抽象解釋的 。

1

如果你在捕捉它們之後有一些有用的事情,那麼可以捕捉異常。例如,假設您在嘗試進行Web服務調用後獲得IOException。在某些情況下,捕獲該異常並重試呼叫可能是有意義的。

當你吞下它們而沒有適當地處理它們時,捕捉異常就變成了「壞事」。在這種情況下,你最好拋出異常,並從更高層次處理它,更清楚它的行爲應該是什麼。只有在是有意義的,可以治療

1

"Throw early catch late!"

例外應該被捕獲。 這個想法是將異常傳播到應用程序的層,以使用戶或業務邏輯可以對異常採取一些行動。