将PrintStackTrace重定向到我自己的功能

时间:2017-01-16 17:03:19

标签: java

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

2 个答案:

答案 0 :(得分:0)

您无法替换所有例外e.printStackTrace()所做的事情。它是非final的,意味着它可以在子类上重写,但默认实现只是:

printStackTrace(System.err);

所以你唯一可以希望挂钩的是System.err

您可以使用自己选择的System.err替换PrintStream

System.setErr(somePrintStream);

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

你可能会以某种方式用你方法的调用替换你所有的e.printStackTrace()调用更好(无论如何它们都具有可疑价值)。

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

您也可以根据errorprone的调查结果找到替换工具。

答案 1 :(得分:0)

如果这是为了好玩,很好,但如果是专业的话,你基本上都在重新发明像Sentry这样的东西,所以你最好只需支付一个现成的工具。

就像安迪·特纳所说,你可以取代printStackTrace(),但它非常混乱,而且不可靠。像Javascript和Python这样的语言使这很容易做到,但在Java中,它很难,因为它违背了面向对象编程的理念(并且遇到了旧的Java实现的局限性)。但是,有一个名为Powermock的工具可以替代方法。可能想看看。

还记得我是怎么提到Sentry的?它通过日志框架完成此任务。无论如何,printStackTrack()被认为是草率的,所以人们通常会迁移到像slf4j这样的东西来进行适当的记录。它们不是打印堆栈跟踪,而是LOGGER.warn("Error communicating with client {}", ipAddr, e);。在记录器的另一端是一个appender,它被配置为实际记录不同的级别(错误,警告,信息,调试,跟踪)和不同的类。 Sentry这样做的方式是它附加一个appender。如果你做了同样的事情,你就可以获得e

最后一件事:无论哪种方式,您都可以查看uncaughtExceptionHandler。除非你抓住所有扔掉的东西,否则你可能会错过一些有趣的东西,而不会记录它。