Ответ 1
Используйте Thread.setDefaultUncaughtExceptionHandler. См. Rod Hilton "" Глобальная обработка исключений" в блоге для примера.
Есть ли способ сделать глобальный обработчик исключений в Java. Я хочу использовать вот так:
"When an exception is thrown somewhere in the WHOLE program, exit."
Обработчик не может перехватывать исключения, отбрасываемые в тело try-catch
.
Мартейн
Используйте Thread.setDefaultUncaughtExceptionHandler. См. Rod Hilton "" Глобальная обработка исключений" в блоге для примера.
Вы можете установить значение 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 или для случаев, когда вы уверены, что у вас есть определенная точка входа для Thread.
В тех случаях, когда у вас нет четко определенной точки входа для Thread, например, когда вы работаете в контексте веб-сервера или сервера приложений или в другой среде, где настройка и отключение обрабатываются вне вашего кода, посмотрите, как эта структура обрабатывает глобальные исключения. Как правило, эти фреймворки имеют свои собственные установленные глобальные обработчики исключений, которые вы стали участником, а не определяете.
Для более подробного обсуждения см. http://metatations.com/2011/11/20/global-exception-handling-in-java/
DefaultUncaughtExceptionHandler - правильный ответ. Это было показано мне Jeff Storey в этом месте, несколько дней назад. Как вы подозревали, "обработанные вручную" исключения никогда не будут пойманы этим обработчиком. Однако я получил следующее предупреждение:
** - Чтобы соответствовать J2EE, webapp не должен использовать нить. **
когда я проверил свой проект с хорошей практикой и рекомендовал стиль java-кодирования с PMD плагин для Eclipse IDE.
Threads.setDefaultUncaughtExceptionHandler() работает, но не во всех случаях. Например, я использую его в своем main() перед созданием виджета Swing и работает в потоках, созданных Swing, таких как поток событий AWT или потоки SwingWorker.
К сожалению, это не влияет на поток, созданный javax.naming.spi.NamingManager.getInitialContext() при использовании URL-адреса LDAP с использованием JavaSE 1.6. Несомненно, есть и другие исключения.