2016-01-09 34 views
1

我正在使用Java,我想知道創建Exception子類拋出biz異常的優缺點,還是應該使用錯誤代碼來處理biz異常?創建異常子類來處理業務邏輯錯誤或使用錯誤代碼?

讓我們以一個典型的銀行應用爲例,當資金轉移出錯時有幾個例外。即資金不足,目標賬戶無效,超過當日的最高轉賬限額。

我應該創建一個返回給調用者的錯誤代碼列表嗎?或者我應該拋出Exception類(從Exception繼承)給調用者?

如果我要爲每個biz例外創建Exception,則可能有很多Exception類。

+0

可能值得一讀:http://stackoverflow.com/questions/2286747/creating-exception-classes-for-lot-different-error-codes?rq=1 –

回答

2

您可以使用Exception類一路拋出異常與特定的消息,甚至可以發出錯誤代碼。

但是你的業務邏輯應該決定你是想創建一個異常還是帶有錯誤代碼。

使用自定義異常具有很大優勢,即您可以定義層次結構。以您的銀行申請爲例,我們知道如果出現基金資金不足,目標賬戶無效,超過當天最高轉賬限額,則所有這些都是由於某種原因導致的交易失敗。因此,你的異常層次結構可能會象下面這樣:

   TransactionFailureException 
      /   \ 
     /   \ 
     /    \ 
    /     \ 
InsufficientFundException/InvalidTargetAccountException/MaxLimitReachedException 

因此異常處理爲您提供了這是由每個人都知道一個標準的業務邏輯電平錯誤的層次結構,因此是有幫助的是建立標準。

但是,錯誤代碼也非常重要,因爲這些代碼僅通過代碼編號來指定特定的問題。

會推薦使用兩者來獲得最佳的健壯應用程序。

1

異常處理的一大優點是它可以讓代碼更清晰。如果動作沒有太多的if語句,那麼代碼看起來就像是一個sequenece,所以主要用例在源代碼中顯而易見。

在Java中,編譯器也有幫助,因爲它強制你聲明函數可能拋出的異常類型。

現在,如果您有許多不同的失敗原因,您不一定需要爲每個原因創建一個單獨的異常類。他們可以共享相同的異常類型,其中的枚舉提供了更具體的信息。或者你可以創建單獨的異常類,並讓它們各自繼承相同的基本異常。如果處理異常的邏輯對所有這些異常都是相同的,則需要捕獲基本異常。

1

您可以一起使用這兩者以實現可靠的錯誤處理和記錄目的。

  1. 創建的錯誤代碼和相應的錯誤描述的預定義列表,並讓那些商店一些持久性存儲器。每次啓動應用程序時,都會在Map中加載相同的內容。存儲在持久存儲中將具有兩個好處:

    a。可伸縮性:如果您有一大堆錯誤代碼,最好將它們存儲在表中,而不是用代碼對其進行硬編碼。

    b。可維護性:維護將很容易。每次錯誤代碼或錯誤描述發生變化時,無需修改代碼。還可以添加任何新的錯誤代碼。例如,對於新的錯誤代碼,您的錯誤代碼表中只需一個插入查詢就足夠了。

  2. 創建基於該業務的定製類業務異常(例如,一類可能是InvalidAccountInformation,另外一類可能是InvalidTransaction等)。您可以在這些自定義業務例外中傳遞自定義錯誤代碼。您可以使用錯誤代碼獲取自定義錯誤描述並進行相應的日誌記錄。 一個好主意應該是你的自定義異常應該是RuntimeException類的子類。

+0

爲什麼你會在數據庫中存儲錯誤代碼? – tddmonkey

+0

@MrWiggles,如果您有一大堆錯誤代碼,將它們存儲在數據庫表中並在應用程序啓動時加載它們總是一個好主意。如果您的錯誤代碼集相對較少,則無需存儲在持久性存儲中,並將它們存儲在代碼本身中。 – atom

+0

它們的大小有什麼不同?我發現將這些數據存儲在數據庫中幾乎沒有任何好處,但它*增加了複雜性 – tddmonkey

1

使用錯誤代碼將導致:

  • 通話功能和返回錯誤代碼
  • 然後處理在if-else的級聯
  • 並在每個條件塊恢復的背景下錯誤代碼
  • ,然後恢復功能

在這種情況下的例外可能有很大的幫助:

  • 你將不必返回錯誤代碼,你可以使用的返回值更有意義的結果
  • 你會不會在if-else的級聯但一個try-catch-來處理錯誤級聯(這是爲讀者更好地看到事端恢復)
  • 你不會有恢復的背景下,因爲異常可容納必要的上下文信息(如果正確設計)

如果錯誤代碼只是一個拋棄 - 即將被忽略,並且不能恢復一個簡單的異常類型holdin g一個錯誤代碼就足夠了。