Подтвердить что ты не робот

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

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

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

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

Мартейн

4b9b3361

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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