所以我正在开发一个Stacktrace inerpreter,所以我想知道有没有办法将所有e.printStackTrace()调用重定向到我的printTrace()?
答案 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。除非你抓住所有扔掉的东西,否则你可能会错过一些有趣的东西,而不会记录它。