【问题标题】:Redirect PrintStackTrace to my own function将 PrintStackTrace 重定向到我自己的函数
【发布时间】:2017-01-16 17:03:19
【问题描述】:

所以我正在开发一个 Stacktrace inerpreter,所以我想知道有没有办法将所有 e.printStackTrace() 调用重定向到我的 printTrace()?

【问题讨论】:

  • 您可以将System.err 替换为您自己选择的PrintStream。但这会将所有内容发送到System.err
  • 您的意思是在try-catch 块中吗?还是你的意思是改变e.printStackTrace() 的作用?
  • 在开始之前,建议您先看一下异常处理文档 (stackoverflow.com/documentation/java/89/…)

标签: java


【解决方案1】:

您无法替换 e.printStackTrace() 对所有异常所做的操作。它是非最终的,这意味着它可以在子类上被覆盖,但默认实现很简单:

printStackTrace(System.err);

因此,您唯一可以希望与之挂钩的是System.err

您可以将System.err 替换为您自己选择的PrintStream

System.setErr(somePrintStream);

但这会将所有内容发送到System.err。您要么必须处理所有事情,要么以某种方式仅提取堆栈跟踪 (some ideas are here)。

您最好以某种方式将所有 e.printStackTrace() 调用替换为您的方法调用(无论如何,它们的价值值得怀疑)。

我不知道如何最好地建议您这样做;但是,例如,您可以通过 Google's errorprone 之类的编译器工具禁止对 Throwable.printStackTrace() 的调用。

您还可以根据容易出错的发现找到工具来进行替换。

【讨论】:

  • 这是一个很好的答案,但我觉得它并没有完全回答这个问题,而是讲述了一种可能的方法(imo 与 OP 所说的不同)。就个人而言,我认为您的第二个建议可以使用一些详细说明,这将使这个答案变得更好(再次,这就是我的看法......)
【解决方案2】:

如果这是为了好玩,很好,但如果是为了专业,你基本上是在重新发明像 Sentry 这样的东西,所以你最好还是花钱买一个现成的工具。

就像 Andy Turner 建议的那样,您可以替换 printStackTrace(),但它非常混乱,并非不可靠。像 Javascript 和 Python 这样的语言使这很容易做到,但在 Java 中,这很难,因为它违背了面向对象编程的哲学(并且遇到了 Java 旧实现的限制)。不过,有一个名为 Powermock 的工具可以替换方法。可能想看看。

还记得我提到过哨兵吗?它通过一个日志框架来做到这一点。无论如何,printStackTrack() 被认为是草率的,因此人们通常会迁移到 slf4j 之类的东西来进行适当的日志记录。他们没有打印堆栈跟踪,而是使用LOGGER.warn("Error communicating with client {}", ipAddr, e);。在记录器的另一端是一个附加器,它被配置为实际记录不同的级别(错误、警告、信息、调试、跟踪)和不同的类。 Sentry 这样做的方式是附加一个附加程序。如果你也这样做,你就有机会获得e

最后一件事:无论哪种方式,您都可能想查看uncaughtExceptionHandler。除非你捕捉到了所有的投掷物,否则你可能会错过一些有趣的东西并且永远不会记录它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 2016-07-15
    • 2012-08-13
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2021-06-20
    • 2012-08-11
    相关资源
    最近更新 更多