Определение одного глобального 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 (это поведение по умолчанию).

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

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

Может быть сделано даже на Java?

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

Ответ 1

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

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

Как сообщает doc

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

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

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

Ответ 2

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