2011-03-09 43 views

回答

9

兩個原因立即映入腦海:

  1. 簡單,所以你不說try { ... } catch (Exception e) { ... } - 擁有自己的子類可以分別處理不同的異常情況。 (如沒有權限運行報表和報表執行失敗之間的區別)。
  2. 您可以添加額外的上下文 - 例如,如果您有自己的AlreadyLoggedInException,例如,該異常可以有一種方法來檢索其他會話啓動的IP地址。或者AccountLimitExceededException可能包含當前帳戶限制。異常中的額外信息可讓您在捕捉異常時採取更有效的反應。
+1

請問您可以給出一個工作示例,以便它對我變得更加清楚? – Deepak 2011-03-09 12:38:46

1

提供錯誤特定信息,允許更多細粒度的異常處理程序。

1

是的。最大的好處是它可以讓你拋出異常,這意味着你想要的是。如果您重複使用現有的異常,則任何捕獲異常的代碼都必須處理實際異常不是由您的代碼引發的可能性,而是由其他庫代碼引發的可能性。這往往會使錯誤處理更加靈活。

0

使用自定義異常,您可以告訴您的調用者發生了特定類型的錯誤,而不僅僅是錯誤。因此,來電者可能會特別喜歡這種錯誤。

讓我們用一個汽車的比喻:你喜歡你的汽車拒絕以獨特的紅燈閃爍開始,還是專用的「燃氣罐空」燈閃爍?

+1

我知道你想說什麼,但談論消息並不是一個好的比喻。如果它只是消息,那麼我們都可以'拋出新的異常(「我不會開始,因爲我沒油了)' – 2011-03-09 11:11:31

+0

你說得對。與往常一樣,汽車的比喻不是一個很好的類比。我會編輯我的文章,以避免談論消息。 – 2011-03-09 11:20:29

2

非常簡單,它允許您以正確的方式處理每個異常。

考慮下面的代碼

try { 
    doSomethingThatCouldThrowManyExceptions(); 

} 
catch (ExceptionalCircumstance1 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance2 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance3 ex) { 
    // deal with this specific circumstance 
} 
finally { 
    // do some common code 
} 

沒有這一點,你會留下試圖做一個包羅萬象的異常類型。

但是,如果一切順利,類層次結構仍然意味着您仍然可以使用catch(Exception ex) {}捕獲所有異常。

+0

您可能希望將類重命名爲ExceptionalCircumstance2和ExceptionalCircumstance3 ;-) – perdian 2011-03-09 11:15:38

+0

好點!複製並粘貼反模式再次獲勝。 – Codemwnci 2011-03-09 12:04:51

0

在我看來,自定義異常的主要動機是實現更好的應用程序域建模。在設計課程時,您會花費大量精力來命名對象並分配其職責。我認爲在這一點上考慮可能的錯誤條件是一項很好的投資。例如,當深入挖掘時,客戶通常會給你一些必須處理的常見示例(例如無效數據,違反邏輯限制,不可靠傳感器等)。因此,您將擁有更易於理解和修改的代碼。應用程序特定的錯誤可以很好地分離,並且可以輕鬆實現處理其他錯誤。

另一點是它可能爲系統的不同部分提供更好的抽象。例如,如果您確實預期持續性部分的實現將在未來發生變化,那麼在其API中使用自定義異常要好得多。否則,您將在以後很多樂趣處理許多不同地方的SQLException或SAXExceptions :-)