Java: глобальный обработчик исключений - PullRequest
39 голосов
/ 10 октября 2009

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

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

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

Мартейн

Ответы [ 6 ]

57 голосов
/ 10 октября 2009

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

4 голосов
/ 10 октября 2009

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

3 голосов
/ 14 августа 2012

Вот пример, который использует 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)

2 голосов
/ 20 ноября 2011

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

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

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

0 голосов
/ 26 марта 2015

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

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

0 голосов
/ 10 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...