main()
, выполняется в потоках. Поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System.err
. Если это был последний пользовательский поток, приложение начнет завершение работы.Для изменения логики обработки непойманных исключений в Java существует функциональный интерфейс
Thread.UncaughtExceptionHandler
.Обработчик упущенных исключений может быть установлен (в порядке возрастания приоритета):
• глобально на всё приложение, статическим методом
Thread.setDefaultUncaughtExceptionHandler()
;• для группы потоков, переопределением метода
uncaughtException()
в реализации объекта подкласса ThreadGroup
(т.к. ThreadGroup
сам является наследником UncaughtExceptionHandler
);• для отдельного потока, методом
setUncaughtExceptionHandler()
.Естественно, установка нестандартного обработчика не имеет обратной силы. Используя его, нужно убедиться, что он установлен достаточно рано, до выброса какого-либо исключения.
Хорошей практикой считается обрабатывать исключение настолько близко к месту его выброса, насколько возможно. Следовательно, использование глобальных обработчиков – самый плохой вариант.
Так же как в случае различных финализаций, несмотря на все её недостатки, глобальная обработка иногда лучше, чем ничего. Она может, например, дать последний шанс освободить внешние ресурсы, или уведомить о некорректной работе программы более эффективно, чем через логи.