Определение одного глобального UncaughtExceptionHandler для всех потоков моего приложения - PullRequest
12 голосов
/ 03 декабря 2011

Я хочу определить один уровень приложения 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);

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

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

Ответы [ 2 ]

17 голосов
/ 03 декабря 2011

Thread.setDefaultUncaughtExceptionHandler (UncaughtExceptionHandler ex)

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

Как говорит доктор

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

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

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

5 голосов
/ 03 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...