2011-02-23 68 views
0

你覺得這是值得的包裝在一個try catch塊的所有服務的方法來記錄異常這樣的:記錄和包裝異常。這是一個好習慣嗎?

public void attachClean(Car instance) { 
    log.info("attaching clean Car instance"); 
    try { 
     getSessionFactory().getCurrentSession().lock(instance, LockMode.NONE); 
     log.info("attach successful"); 
    } catch (RuntimeException re) { 
     log.error("attach failed", re); 
     throw re; 
    } 
} 

好像很多打字

+0

你的環境是什麼?例如,這是一個「獨立」應用程序還是一個在JBoss中運行的web應用程序等。這看起來不正確,您應該有一箇中心位置捕獲未捕獲的異常並將其記錄下來。 – AlfaTeK 2011-02-23 19:12:10

+0

我只是使用一個註解@Trace來記錄這個庫的方法參數和結果/異常:https:// github。com/nicholas22/jpropel – 2011-10-09 10:19:38

回答

5

您通常日誌或重新拋出,但不都。高層可能能夠處理例外狀態,並且在這種情況下記錄整個堆棧跟蹤將是不必要的。 Hovewer,如果你確實想確保它已被記錄,你可以自己登錄。多次記錄異常比在日誌文件中丟失重要的異常要好。

1

想想如果所有事情都做到這一點,日誌將如何顯示。然後想想如果沒有人會怎麼樣。

您需要一個合理的平衡。例如,如果你正在創建一個API,你可能需要記錄將你的庫留給用戶代碼的東西。

4

這是一個可怕的的做法。除了更多的輸入外,你什麼也沒有達到,可能是在日誌中重複堆棧跟蹤,還有幾條額外的行來測試。如果這是一個RuntimeException,並且無法處理它(記錄!=處理),只是讓它飛得更高,也許有人能夠正確處理它(框架/容器最好)。\

順便說一句一個可以練習隨時登錄某種情況下對你的工作,所以你可能想寫點東西像(SLF4J方言):

log.info("attaching clean Car: {}", instance); 
getSessionFactory().getCurrentSession().lock(instance, LockMode.NONE); 
log.info("{} attach successful", instance); 
1

您可以讓像Spring依賴注入的框架做繁重的,由用AOP proxies配置它來裝飾你的課程。鏈接的例子顯示瞭如何使用它進行授權檢查,但日誌記錄會非常相似。

1

在我看來...沒有。

這是另一回事,如果你正在捕捉異常並相應地處理請求,例如執行一些清理。但是,如果你只是試着去記錄錯誤,那麼它就沒有任何意義。畢竟,來自運行時異常的堆棧跟蹤會告訴您發生異常的位置。你可以在最上面做一個「全能」,而不是在所有地方進行嘗試。

如果你真的偏執,你可以使用AspectJ的「around」建議來執行集中的「try-catch-log-error」塊。這比用幾乎沒有任何東西的醜陋嘗試catch塊污染你的代碼要好得多。

0

如果你的方法attachClean是系統的外部接口的一部分,那麼日誌記錄cruicial ..否則,你沒有你的客戶收到異常任何線索..

如果此方法是內部部件你的系統的實現,記錄是不必要的。因爲異常將由您的外部接口處理。

0

我不會重新拋出異常。您必須再次捕捉它,添加更多樣板代碼。另外,嘗試中的代碼更慢。

相關問題