Java: глобальный обработчик исключений

Есть ли способ сделать глобальный обработчик исключений в Java. Я хочу использовать так:

"When an exception is thrown somewhere in the WHOLE program, exit."

Обработчик не может перехватывать исключения, выдаваемые в try-catch тело.

Мартейн

6 ответов

Решение

Используйте Thread.setDefaultUncaughtExceptionHandler. См. Пример в блоге Рода Хилтона " Глобальная обработка исключений".

Вы можете установить UncaughtExceptionHandler по умолчанию, который будет использоваться всякий раз, когда исключение распространяется по всей системе.

Вот пример, который использует Logback для обработки любых необработанных исключений:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e);
        System.exit(1);
    }
});

Это также можно сделать для каждого потока, используя Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

Для пояснения используйте setDefaultUncaughtExceptionHandler для автономных приложений Java или для случаев, когда вы уверены, что у вас есть четко определенная точка входа для потока.

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

Более подробное обсуждение см. По http://metatations.com/2011/11/20/global-exception-handling-in-java/

DefaultUncaughtExceptionHandler - правильный ответ. Это открыл мне Jeff Storey в этом месте несколько дней назад. Как вы и предполагали, "обработанные вручную" исключения никогда не будут перехвачены этим обработчиком. Однако я получил следующее предупреждение:

** - Чтобы соответствовать J2EE, веб-приложение не должно использовать какой-либо поток.**

когда я проверил свой проект на соответствие хорошей практике и рекомендовал стиль кодирования Java с плагином PMD для Eclipse IDE.

Threads.setDefaultUncaughtExceptionHandler() работает, но не во всех случаях. Например, я использую его в main() перед созданием виджетов Swing, и он работает в потоках, созданных Swing, таких как поток событий AWT или потоки SwingWorker.

К сожалению, это никак не влияет на поток, созданный javax.naming.spi.NamingManager.getInitialContext() при использовании URL-адреса LDAP и JavaSE 1.6. Без сомнения, есть и другие исключения.

Другие вопросы по тегам