2013-09-20 4 views
0

Небольшой пример: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" 

Вопрос:

Почему сообщение не содержит никакой информации о том, где это происходит, и нет трассировки стека, сообщение?

Что касается меня сообщение об ошибке выглядит странно.

+0

Параметр 'UncaughtExceptionHandler' предназначен для * ручка * неперехваченные исключения не бросать исключения. – Holger

ответ

2

документация API Java-говорит:

void uncaughtException(Thread t, Throwable e) 

метод вызывается, когда данная поток завершается из-за данным неперехваченное исключение. Любое исключение, вызванное этим методом, будет игнорироваться виртуальной машиной Java.

Так что, если вы хотите, чтобы программа оканчиваются на некоторых исключений и печатать их сообщение/StackTrace вы должны сделать:

 @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      if (e instanceof RuntimeException) { 
       e.printStackTrace(); 
       System.exit(1); 
      } 
     } 
Смежные вопросы