UncaughtExceptionHandler更改异常消息

时间:2013-09-20 08:47:23

标签: java exception uncaughtexceptionhandler

小例子:

 public class App {   
     public static void main(String[] args) {
         throw new RuntimeException("Test exception");
     }
 }

按预期打印:

Exception in thread "main" java.lang.RuntimeException: Test exception
    at App.main(App.java:5)

让我们修改这个程序:

public class App {    
    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                if (e instanceof RuntimeException) throw (RuntimeException)e;
            }
        });
        throw new RuntimeException("Test exception");
    }
}

打印:

Exception: java.lang.RuntimeException thrown from the UncaughtExceptionHandler in thread "main"

问题:

为什么message不包含任何有关它出现位置的信息,并且没有堆栈跟踪,消息?

至于我,异常消息看起来很奇怪。

1 个答案:

答案 0 :(得分:2)

Java API文档说:

void uncaughtException(Thread t, Throwable e)
  

当给定线程由于给定的未捕获异常而终止时调用的方法。    Java虚拟机将忽略此方法抛出的任何异常。

因此,如果您希望程序在某些例外情况下终止并打印其消息/堆栈跟踪,您应该这样做:

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e instanceof RuntimeException) {
                 e.printStackTrace();
                 System.exit(1);
            } 
        }