防止Java在某些异常情况下打印堆栈跟踪信息

5
我有一个安全类,如果用户未被授权执行某个操作,则会抛出AccessDeniedException。我将其改进并添加了所需信息的消息。
问题是现在我的日志中充满了每次抛出异常的堆栈跟踪。我不想看到异常的堆栈跟踪,而且堆栈跟踪使我的日志变得臃肿。
是否有一种方法告诉Java,如果是这个异常,不要将堆栈跟踪打印到日志中?

你使用日志框架吗?Java日志记录器?还是什么都没有,线程只为你转储堆栈跟踪信息? - Guillaume Polet
@llappall:这是不是你没有遵循“不记录并抛出”建议的情况?如果你既要记录(你写道“我甚至让它变得更整洁,并在其中加入了我所需的信息”,看起来像是你在记录),然后再抛出异常,那么记录输出就会变成一个巨大的混乱... - TacticalCoder
@user988052:我在异常本身中设置了消息。 - llappall
你正在某个地方打印它。找到这个地方,只记录错误信息。 - Senthil Kumar
4个回答

5

我不知道这是否能帮助您记录日志,但是如果您仅为了改进代码的逻辑和可读性而创建异常,并且从未想过它来自哪里,那么可以重写fillInStackTrace()方法,如下所示:

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

这将会提高您的程序性能——如果您使用了很多,则效果显著。它不会消除日志记录。其他答案应该可以帮助解决这个问题,但如果不能,您的日志消息 将会 大大减少。


4
问题在于现在我的日志文件里充满了堆栈跟踪信息。
这就像说“我的火警一直响,怎样才能让它更安静?”。只有两种好的解决方案。
1. 确定这些是误报警,修改您的报警系统,使其不那么敏感于实际上并不危险的事件。抛出异常并不意味着存在错误,即使是已检查的异常也是如此。即使检查异常值得记录,也不需要记录堆栈跟踪信息,因为堆栈跟踪信息仅用于调试。
2. 确定警报是真实的,然后找出引发问题的原因,并修复导致异常抛出的任何错误。如果您有很多错误会使日志文件泛滥,那么先修复哪个并不重要,所以只需先修复在日志文件中易于阅读的错误即可。

0

你可以决定捕获特定的异常并对其不做任何处理。 或者你可以在当前线程上设置UncaughtExceptionHandler

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

在处理程序中,您可以对异常执行 instanceof 操作,以查看它是否是特定的异常。


0
你需要调查一下在哪里捕获(如果有捕获)这个异常,并确保你不记录异常,而只记录消息...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接