2016-05-12 17 views
1

我已經創建了一個spring應用程序,其中我已經實現了log4j進行日誌記錄。我的應用程序中有300多個錯誤(例外)。我爲每個錯誤創建了單獨的用戶定義的例外。那些類只是返回錯誤消息。是否有必要爲每個錯誤創建用戶定義的例外

原因創建單獨的例外:

  1. 開發者不應該錯過了處理任何錯誤的情況下,當我創建例外,它在默認情況下,他們不得不處理處理的情況顯示錯誤。
  2. 當我通過日誌記錄時,如果爲我的錯誤場景創建單獨的用戶定義的異常,記錄它時我會更加明瞭。

現在我想知道:

  1. 是否有必要爲每個錯誤情景個人用戶定義的異常?
  2. 大多數人如何更好地處理錯誤和用戶定義的異常?
+1

1. **否**。 2.通過以對開發人員恢復有意義的方式對錯誤進行分類。堆棧跟蹤會告訴你發生異常的位置,所以你不知道爲什麼要創建300個自定義異常。 –

+0

確實沒有必要創建如此多的自定義異常。您可能會發現現有的異常類將足以使用,而不是您創建的許多異常。然後,您可以通過向每個異常的構造函數傳遞不同的消息和原因來使這些更具體。 https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/exceptions/lecture.html https://docs.oracle.com/javase/7/docs/api/java/郎/ Exception.html –

回答

2

我會很高興如果你可以用例子更新你的問題。我現在已經構建了很多企業應用程序,我通常遵循的座右銘是確保您的異常類型解釋錯誤的正確類別,並確保您的異常消息正確地解釋了錯誤。除非需要正確分類您正在使用的異常類型,否則不應創建自定義異常。下面是從mabbas一個很好的例子:

When should we create our own java exception classes?

0

我覺得你的問題不能在一個很好的方式來回答;這實際上是在討論不同的意見。我的意見:只要你的個別例外都是明確的(而不是重疊在他們的意思);每個人都有良好的信息,並隨後提供調試問題所需的信息......然後:不要擔心。這就是例外情況。更多(和自定義)異常還允許更具體和更精細的錯誤處理。但是如果使用異常帶來嚴重的代價(在我們的環境中,我們從「獨立」節點A向節點B發送異常......而現在,突然之間,您必須確保A,B在匹配的代碼級別),事情是不同的。那麼你可能會非常仔細地考慮,哪個架構給你最多的「投資回報」。

0

似乎有點過分,可以爲300個例外創建300個錯誤。我所做的是創建我們自己的HttpErrorException類,其中包含我們想要返回的HTTP錯誤。建議開發人員在遇到異常或錯誤時拋出其中一個。如果冒出的例外不是新的HttpErrorExceptions之一,則返回500。我們沒有將其他異常轉換爲HTTP錯誤,因爲我認爲假定每個特定異常事件總是映射回特定的HTTP錯誤是錯誤的。原因是因爲有很多依賴關係(我們正在使用的其他庫),他們可能會拋出任何類型的異常,對於任何特定的情況,可能無法很好地映射到我們想到的HTTP錯誤。所以我寧願明確。

下面是一個典型用法的扼殺例子。

Account getAccount(String id){ 
    Account a = null; 
    try{ 
     a = accountRepo.findById(id); 
    catch(Exception e) { 
     String error = "Got exception while trying to get Account from db."; 
     logger.(error, e); 
     throw new HttpErrorException(500, error); 
     //or throw new HttpErrorException(HttpStatus.INTERNAL_SERVER_ERROR, error); 
    } 
    throw404IfNull(a); 
    return a; 
} 

throwIf404IfNull就是我們創建,以減少我們的代碼if語句的簡單方法。我們有幾種這樣的方法,我們的代碼保留了if語句,否則它們會被單元測試。

void throw404IfNull(Object obj){ 
    if(obj == null) { 
     throw new HttpErrorException(400, "Object was not found"); 
    } 
} 

我們使用Spring的異常處理功能,所有HttpErrorException的映射到同是在異常的錯誤狀態很好很好格式化的HTTP錯誤。

相關問題