Определение одного глобального 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. При этом будет установлен обработчик исключений для запуска приложения. Это будет значение по умолчанию для любых новых потоков, если не указано иное.