我的第一个问题是谁实际打印堆栈跟踪的打印件?是 JVM 还是其他实体?打印堆栈跟踪时幕后会发生什么?如果有应用程序提供了 UncaughtExceptionhandler,我正在专门寻找一个答案,告诉我 Uncaught 异常处理程序在打印堆栈跟踪中的作用。
3 回答
1.当异常发生时,它被抛出到JVM。
2. JVM 然后打印 StackTrace。
3. StackTrace 包括方法名、类名、文件名和行号。
4. fillInStackTrace()
调用方法重新初始化新创建的 throwable 中的堆栈跟踪数据。将有助于在尝试访问 API 时屏蔽有关异常的信息。
您是在谈论未捕获的异常吗?如果您捕获到异常,您可以使用该Throwable.printStackTrace
方法自己打印堆栈跟踪。如果您想知道它如何准确地打印堆栈跟踪,您可以查看源代码。
对于未捕获的异常,堆栈跟踪由抛出异常的线程的“未捕获的异常处理程序”打印。如果线程没有自己的未捕获异常处理程序,则使用线程组的处理程序,该处理程序又委托给父线程组或“默认未捕获异常处理程序”。如果没有父处理程序也没有默认处理程序,则会发生这种情况:
否则,此方法确定
Throwable
参数是否为ThreadDeath
. 如果是这样,没有什么特别的。否则,一条包含线程名称的消息(从线程的getName
方法返回)和使用Throwable
'printStackTrace
方法的堆栈回溯将打印到标准错误流。
您可以使用Thread.setUncaughtExceptionHandler
. 要设置默认的未捕获异常处理程序以捕获任何未捕获异常,请使用Thread.setDefaultUncaughtExceptionHandler
AThrowable
及其所有子类(如 Exception 和 RuntimeException)是try-catch
andthrow
关键字所必需的,处理它们的是 JVM 的 Java 部分。
唯一不是纯 Java 的fillInStackTrace()
方法是本机方法,这意味着该方法是由 Java 部分“外部”的 JVM 提供的。如果变量中有 Throwable,则可以检查堆栈跟踪的所有部分。
http://www.docjar.com/html/api/java/lang/Throwable.java.html
请注意,在“过去”中,异常是昂贵的对象(我相信这是因为堆栈跟踪是在构造异常时计算的,无论是否使用它),但这已经通过延迟堆栈进行了相当多的优化跟踪生成,直到实际需要为止。