当前位置: 首页 > 知识库问答 >
问题:

如果java中存在未处理的异常,谁会打印异常堆栈跟踪?

连厉刚
2023-03-14

当使用try/catch块时,我们可以使用e打印catch块中的堆栈跟踪。printStacktrace()方法。

如果出现未处理的异常,仍会打印堆栈跟踪。

谁在控制台上打印堆栈跟踪?怎么做?

共有1个答案

张嘉
2023-03-14

如果异常没有在您正在查看的代码中的Java(由一个catch块)中显式捕获,那么将发生以下情况:

>

  • 异常将向上传播调用堆栈,直到找到另一个catch块来处理它。如果是这样,那太好了。如果它到达堆栈顶部并且没有catch块来处理它,那么:

    它由指定为该线程的未捕获异常处理程序的任何程序处理。这是显式设置为在出现这种情况时运行的代码块。如果未指定处理程序,则:

    它将在ThreadGroup上调用uncaughtException()。根据其Javadoc,这执行以下操作:

    • 如果此线程组具有父线程组,则使用相同的两个参数调用该父线程组的uncaughtException方法

    粗体是我的,默认情况下,这是负责打印堆栈跟踪的行为。

    顺便说一句,如果您愿意的话,您可以实际验证最后一部分-像您期望的那样,这样的东西将打印(短)堆栈跟踪:

    public static void main(String[] args) throws Throwable {
        throw new Throwable();
    }
    

    线程“main”java.lang.Throwable在javaapplication6.javaapplication6.main中出现异常(javaapplication6.java:18)

    然而,根据上述文件,这不会打印任何内容:

    public static void main(String[] args) throws Throwable {
        throw new ThreadDeath();
    }
    

  •  类似资料:
    • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。

    • 问题内容: 是否有一种特殊的机制来强制scrapy打印出所有python异常/堆栈跟踪。 我犯了一个简单的错误,即弄错了一个列表属性,导致AttributeError出现,该错误未在日志中完整显示: 因此它显示的AttributeError计数为1,但是没有告诉我在哪里以及如何进行操作,我不得不手动在代码中放置ipdb.set_trace()来找出哪里出错了。Scrapy本身继续执行其他线程而不打

    • 问题内容: 我的类的实例变量之一正在发生某些事情。我想将变量设置为属性,并且每当访问该变量时,我都希望打印出导致该点的所有代码的堆栈跟踪,因此我可以看到它的混乱之处。没有异常发生时如何打印堆栈跟踪?我知道是否有例外,我可以做类似的事情。 同样有用的是仅打印最后3-4个级别,因为前几个级别可能不会那么有趣。 问题答案: : 编辑:您还可以使用extract_stack,获取一个切片(例如,排除前5个

    • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

    • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

    • 异常对象的 printStackTrace() 方法用于打印异常的跟踪栈信息,根据 printStackTrace() 方法的输出结果,开发者可以找到异常的源头,并跟踪到异常一路触发的过程。 看下面用于测试 printStackTrace 的例子程序。 上面程序中 main 方法调用 firstMethod,firstMethod 调用 secondMethod,secondMethod 调用 t