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"

Вопрос:

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

Как по мне, сообщение об исключении выглядит странно.


person nkukhar    schedule 20.09.2013    source источник
comment
UncaughtExceptionHandler предназначен для обработки необработанных исключений, а не для создания исключений.   -  person Holger    schedule 20.09.2013


Ответы (1)


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

void uncaughtException(Thread t, Throwable e)

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

Поэтому, если вы хотите, чтобы программа завершилась при некоторых исключениях и распечатала их сообщение/трассировку стека, вы должны сделать:

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e instanceof RuntimeException) {
                 e.printStackTrace();
                 System.exit(1);
            } 
        }
person Piotr Kołaczkowski    schedule 20.09.2013