通常情况下直接发生异常的信息会被打印出来,但是引起异常的关联栈追踪信息stack trace却不会全部输出,通常我们会看到下面这样的异常输出信息:
Exception in thread "main" java.lang.RuntimeException: rethrow
at hello.TraceExceptionStack.c(TraceExceptionStack.java:28)
at hello.TraceExceptionStack.b(TraceExceptionStack.java:21)
at hello.TraceExceptionStack.a(TraceExceptionStack.java:17)
at hello.TraceExceptionStack.main(TraceExceptionStack.java:13)
Caused by: java.lang.RuntimeException: cause
at hello.TraceExceptionStack.e(TraceExceptionStack.java:37)
at hello.TraceExceptionStack.d(TraceExceptionStack.java:33)
at hello.TraceExceptionStack.c(TraceExceptionStack.java:26)
... 3 more
最后的这行“ ... 3 more”里面其实还包含3行栈的信息,但是被JVM省略了,我们的目的就是显示出这3行。
解决方案:
实现UncaughtExceptionHandler接口,并且将栈信息全部打印出来。
class UEH implements Thread.UncaughtExceptionHandler
设置默认的未捕获的异常处理实例
Thread.setDefaultUncaughtExceptionHandler(new UEH());
实例代码:
package com.utility.tool;
/**
* @Description: Customize a UncaughtExceptionHandler to print all the stack trace exception messages.
* @author: michaelehome
* @date: Mar 8, 2018
*/
public class TraceExceptionStack {
public static void main(String[] args) {
//Use this handler, will print the content of "... 3 more"
Thread.setDefaultUncaughtExceptionHandler(new UEH());
a();
}
private static void a() {
b();
}
private static void b() {
c();
}
private static void c() {
try {
d();
} catch (Exception e) {
throw new RuntimeException("rethrow", e);
}
}
private static void d() {
e();
}
private static void e() {
throw new RuntimeException("cause");
}
}
class UEH implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
StackTraceElement[] ses = e.getStackTrace();
System.err.println("Exception in thread \"" + t.getName() + "\" " + e.toString());
for (StackTraceElement se : ses) {
System.err.println("\tat " + se);
}
Throwable ec = e.getCause();
if (ec != null) {
uncaughtException(t, ec);
}
}
}