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"
Вопрос:
Почему сообщение не содержит никакой информации о том, где оно происходит, и нет трассировки стека, сообщение?
Для меня сообщение об исключении выглядит странно.
1 ответ
Решение
Документация 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);
}
}