2009-10-10 5 views

ответ

0

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

** - Для того, чтобы быть совместимым с J2EE, веб-приложение не должно использовать любую нить **

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

+0

«** - Чтобы быть совместимым с J2EE, webapp не должен использовать нить. **« - Я не знаю об этом. Вы имеете в виду, что метод service() (и doGet(), doPost() и т. Д.) В сервлете не должен порождать новые потоки? – Kolibri

+0

Я понятия не имею, что это значит, поскольку мое приложение не основано на Интернете. Я уже давно это делаю, и я не нашел ответов, я боюсь. Помимо таких предупреждений или «имя переменной слишком короткое» или «имя переменной слишком длинное», я основал PMD, чтобы стать отличным источником вдохновения. Я настоятельно рекомендую. – hypercube

+1

Я немного поработал, и, видимо, вы не можете напрямую создавать потоки в J2EE. Я нашел пару ссылок: http://www.theserverside.com/discussions/thread.tss?thread_id=44353 и http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee -контейнер-обескураженный – Kolibri

1

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

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

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

2

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

0

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

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

Смежные вопросы