【问题标题】:Preventing Java from printing the stack trace on certain exceptions防止 Java 在某些异常上打印堆栈跟踪
【发布时间】:2012-03-03 03:14:36
【问题描述】:

我有一个安全类,它会在未获得特定操作授权的用户上抛出 AccessDeniedException。我把它做得更整洁,并在里面放了一条信息,里面有我需要的信息。

问题是现在我的日志中充满了每次我抛出的堆栈跟踪。我不在乎查看 this 异常的堆栈跟踪,堆栈跟踪使我的日志膨胀。

如果是这个异常,有没有办法告诉 Java 不要将堆栈跟踪打印到日志中?

【问题讨论】:

  • 你在使用日志框架吗? Java 记录器?还是你什么都没有,线程正在为你转储堆栈跟踪?
  • @llappall:会不会是您没有遵循以下建议的情况:“不要记录并抛出”?如果你们都记录(你写了“我把它弄得更整洁了,并在里面放了一条带有我需要的信息的消息” [原文如此],看起来你正在记录)然后抛出,然后记录输出变得一团糟......
  • @user988052:我在异常本身中设置了味精。
  • 您正在某处打印它。找到该位置并仅记录错误消息。

标签: java exception logging


【解决方案1】:

问题是现在我的日志中充满了堆栈跟踪

这就像说“我的火警一直响,我怎样才能让它更安静?”。只有两种好的行动方案。

  • 确定这些是误报,并更改您的警报系统,使其对实际上并不危险的事件不那么敏感。如果是已检查异常,则抛出异常并不表示存在错误,甚至不表示任何非常显着的情况。即使已检查的异常值得记录,堆栈跟踪也不值得记录,因为堆栈跟踪仅对调试有用。

  • 确定警报是真实的,在这种情况下,找出火灾不断爆发的原因并修复引发它们的任何原因。也就是说,修复导致抛出异常的错误。如果您的日志文件有很多错误,那么您首先修复哪个并不重要,所以只需修复日志文件中最容易读取的那个

【讨论】:

    【解决方案2】:

    我不知道这是否会对您的日志记录有所帮助,但如果您创建 Exception 纯粹是为了提高代码的逻辑性和可读性,并且如果您从没想过它到底是从哪里来的,那么覆盖fillInStackTrace() 方法,如下所示:

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

    这将提高你的程序的性能——如果你抛出很多的话,效果会非常显着。它不会消除日志记录。其他答案应该对此有所帮助,但如果没有,您的日志消息大大减少。

    【讨论】:

      【解决方案3】:

      您可以决定捕获该特定异常并且不对它执行任何操作。 您可以在当前的Thread 上设置UncaughtExceptionHandler

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

      并在句柄中对异常执行instanceof 以查看它是否是特定异常

      【讨论】:

        【解决方案4】:

        您需要调查您在哪里捕获(如果捕获)此异常,并确保您不记录异常,而只记录消息...

        【讨论】:

          猜你喜欢
          • 2012-09-04
          • 2020-07-25
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          • 2013-09-21
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          相关资源
          最近更新 更多