【发布时间】:2025-10-06 03:40:01
【问题描述】:
我们有第三方 java 库;在其中没有正确处理异常。
如下所示:
public class UserClass {
public static void main(String[] args) {
try {
// Do something and a exception gets thrown
} catch (Exception e) {
StupidLogger.debug("Exception Occured"); // Here as the exception is not logged we don't know what has actually happened.
}
}
}
由于我无法访问UserClass 的代码,我无法更改里面的代码。
我可以访问StupidLogger 类代码。那么,是否可以通过堆栈跟踪或使用Runtime 类或通过StupidLogger 类的debug() 方法中的任何其他方式访问Exception 对象并正确记录它。
【问题讨论】:
-
如果被抓住了,那就没了。
-
您为什么要访问
Exception?只记录一条消息可能是正确的做法。如果第三方代码在遇到异常时没有进行适当的清理,那将是您应该向其开发人员提出的错误。还是要打印堆栈跟踪?这并不总是合适的;见*.com/questions/7361201/… -
“如果它被抓住了,它就消失了。”。不必要。对
Exception对象的引用可能位于main堆栈帧中的局部变量中...取决于JIT 编译器是否已优化掉该变量。 -
@StephenC 不过,一旦
catch块完成执行,声明(以及范围)就完成了。您可以保留引用或将其传递给在 不同 范围内持续存在的另一个变量,但一旦它被捕获,它仍然会消失。 -
@Unihedron - 但是当您调用
debug时,e仍在范围内(在main内),这就是 OP 想要访问它的时候。main(如所写)中的处理程序中没有任何内容访问e的事实并没有超出范围。