2012-02-10 67 views
2

我有一個安全類,對未被授權執行特定操作的用戶拋出AccessDeniedException。我甚至把它做得整潔,並在那裏提供我需要的信息。防止Java在某些例外情況下打印堆棧跟蹤

問題是,現在我的日誌堆滿了每一次我扔的堆棧跟蹤。我不在乎看到這個異常的堆棧跟蹤,堆棧跟蹤正在膨脹我的日誌。

有沒有辦法告訴Java不要將堆棧跟蹤打印到日誌,如果它是這種異常?

謝謝!

-

llappall

+0

您使用的是日誌框架嗎? Java記錄器?或者你只是沒有任何東西,線程正在爲你堆棧堆棧跟蹤? – 2012-02-10 16:46:52

+0

@llappall:是否會出現這樣的情況,您沒有按照提示說:*「不要登錄並扔掉」*?如果你兩個都記錄了(你寫了*「我把它變得整潔了,並且把信息放在那裏,我需要的信息」[原文如此],然後扔掉),然後日誌輸出變成了一個巨大的混亂... – TacticalCoder 2012-02-10 16:54:23

+0

@ user988052:我在異常中設置了msg。 – llappall 2012-02-10 17:09:06

回答

0

你需要調查,你正趕上(如果捕獲)該異常,並確保你不記錄異常,但只有消息...

0

要麼你可以決定捕捉那個特殊的例外,不要對它做任何事情。 您可以在當前的Thread上設置UncaughtExceptionHandler

Thread.currentThread().setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 

,並在手柄,你除了上執行instanceof,看它是否是特定的異常

2

的問題是,現在我的日誌全棧的痕跡

這就像是說:「我的火警持續熄滅,我怎麼能讓它更安靜?」。只有兩個好的行動方案。

  • 確定,這些是假警報,並改變你的報警系統,所以它不是那些不是真正危險的事件非常敏感。拋出異常並不表示一個錯誤,或者甚至任何非常顯着的東西,如果它是一個檢查的異常。即使檢查異常值得記錄,堆棧跟蹤也不值得記錄,因爲堆棧跟蹤僅用於調試。

  • 確定警報是真實的,在這種情況下,找出火災持續爆發的原因並修復引發它們的事件。也就是說,修復導致異常被拋出的錯誤。如果你有很多的bug淹沒你的日誌文件也沒關係您解決這第一,所以剛修好取其最容易在日誌文件中讀取

+0

Upvote for fantastic metaphor! – 2012-02-10 17:51:50

2

我不知道這是否會幫助你與你的記錄,但如果你是純粹的一種例外,提高你的代碼的邏輯性和可讀性,如果你休想知道它是從哪裏來的挫折感,然後重寫fillInStackTrace()方法,像這樣:

public class AccessDeniedException extends Exception { 
    public synchronized Throwable fillInStackTrace() { return this; } 
} 

這會提高你的程序的性能 - 如果你扔了很多它們會顯着。它不會消除日誌記錄。其他答案應該有所幫助,但如果他們不這樣做,你的日誌消息將會減少