Определение одного глобального UncaughtExceptionHandler для всех потоков моего приложения

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

Так, например, я хочу достичь чего-то вроде этого:

1° LEVEL ---> Call thread own UncaughtExceptionHandler ---> 2° LEVEL Call Thread Group UncaughtExceptionHandler ---> 3° LEVEL Call application(default) UncaughtExceptionHandler 

Проще говоря, я хочу переопределить UncaughtExceptionHandler по умолчанию и определить свой собственный обработчик вместо того, чтобы печатать трассировку стека на System.err (это поведение по умолчанию).

Например, в C # .NET я делаю нечто подобное, обрабатывая обработчики событий необработанных и исключений потока в методе Main () приложения:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

Можно даже на Яве?

Как я могу переопределить UncaughtExceptionHandler по умолчанию в Java?


person aleroot    schedule 02.12.2011    source источник


Ответы (2)


Thread.setDefaultUncaughtExceptionHandler (UncaughtExceptionHandler ex)

Это должно достичь того, что вы ищете.

Как говорит документ

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

И интересное примечание (также в документации) относительно того, как вы используете обработчик в ThreadGroup

Обратите внимание, что обработчик неперехваченных исключений по умолчанию обычно не должен подчиняться объекту ThreadGroup потока, так как это может вызвать бесконечную рекурсию.

person John Vint    schedule 02.12.2011
comment
Действительно ли это для всех потоков приложения или только для текущего потока, в котором он определен? Должен быть определен в основном методе приложения? - person aleroot; 03.12.2011
comment
Он устанавливается как статическое поле в классе Thread, а не как локальное поле потока. Так что это будет справедливо для всех потоков в приложении. Его можно определить в основном методе, но вы, вероятно, захотите определить его в блоке static основного класса. - person John Vint; 03.12.2011
comment
@JohnVint Не могли бы вы дополнить ответ приведенным выше комментарием. Мне было легко понять, когда вы сказали, что это статическое поле в классе Thread. - person Jeril Kuruvila; 10.11.2016

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

person Amir Raminfar    schedule 02.12.2011