在处理非处理异常时,如何捕获当前变量?

时间:2015-04-10 12:36:31

标签: java exception exception-handling

我创建了一个结构来捕获系统上所有未处理的异常并通过电子邮件发送它们。

但是,我需要一种方法来捕获抛出异常的方法的当前变量。

我知道这在PHP中是可行的(使用$ GLOBALS记录当前变量,事件),但是我们如何使用Java来做到这一点?

这对于我们真正了解导致异常的原因非常重要。

这个过程也需要自动进行,因为我们不能把try catch放在所有的系统方法上,但是异常处理程序类需要找到一种方法来获取这个变量。但这是怎么回事?

3 个答案:

答案 0 :(得分:3)

这是不可能的。抛出异常时,Java只记录调用堆栈(即方法指针),然后将其转换为方法签名(不带参数)和行号(如果可用)。

不会记录局部变量和方法参数,因此在您捕获异常时,它们将不再可访问。

没有廉价或简单的方法来实现你想要的。这是您为Java付出的成本比PHP快得多的一部分。

如果你使用像AOP这样的技术,你可以log method parameter when a method is called到一个文件,但仍然不允许你将它们传递给异常处理程序。即使使用AOP,访问局部变量也很困难。

您可以购买像dynatrace这样的产品,它允许重写字节代码,以便在运行时向代码添加日志语句。

或者你可以等待错误进来。通常,某些地区的丛生。然后将日志语句添加到易受攻击的位置,或者抛出新的异常,向您显示有趣的局部变量。

答案 1 :(得分:2)

你要求的基本上是调试状态。这引发了我的搜索,发现了这个:

https://github.com/ankon/attachable-debugger

和这个

https://www.takipi.com/

希望有所帮助/

答案 2 :(得分:1)

如果您无法修改发生例外的方法,则不能(没有一些仪器工具将代码注入到类文件中)。在该方法已被抛出终止之后,在抛出异常的处理程序中,无法访问抛出异常以后的方法中的/ variables参数。

所以你的选择是:

  1. 修改所有方法以捕获异常并重新抛出详细信息,或

  2. 在执行可能导致异常的操作之前修改所有方法以记录其变量

  3. 两者都很难看,都涉及修改所有方法。

    你最好不要尝试。只需捕获异常的堆栈跟踪(以及任何内部异常和/或抑制异常),如果您需要精确的可变状态信息,则必须复制错误并进行调试。

    或者如果你真的需要信息,你需要找到并使用一个工具,它可以将代码注入到类文件中来记录信息。