Definindo um UncaughtExceptionHandler global para todos os encadeamentos do meu aplicativo

Eu quero definir um nível de aplicativo UncaughtExceptionHandler no meu aplicativo Java que é chamado se uma exceção não identificada é lançada em um thread do meu aplicativo. Eu sei que é possível definir uma exceção não capturada para um grupo de thread ( ThreadGroup ) e eu estou realmente usando, mas eu quero definir uma exceção global não capturada para segmentos que não definiram seu próprio manipulador de exceção não capturado ou que são não associado a um grupo de encadeamentos que possuem um manipulador de exceção padrão definido .

Por exemplo, eu quero alcançar algo assim:

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

Em termos simples, quero replace o UncaughtExceptionHandler padrão e definir meu próprio manipulador em vez de imprimir o rastreamento de pilha no System.err (esse é o comportamento padrão).

Por exemplo, em c # .net eu faço algo semelhante manipular o manipulador de events de exceção de tratamento e sem tratamento no método Main () do aplicativo:

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

Pode ser feito até em Java?

Como posso replace o padrão UncaughtExceptionHandler em Java?

Thread.setDefaultUncaughtExceptionHandler (UncaughtExceptionHandler ex)

Isso deve alcançar o que você está procurando.

Como o doc diz

Defina o manipulador padrão chamado quando um encadeamento termina abruptamente devido a uma exceção não identificada e nenhum outro manipulador foi definido para esse encadeamento.

E uma nota interessante (também nos documentos) sobre você usar o manipulador no ThreadGroup

Observe que o manipulador de exceções não detectado padrão geralmente não deve adiar para o object ThreadGroup do encadeamento, pois isso poderia causar uma recursion infinita.

Você precisa definir o manipulador de exceções não detectado padrão. Este é um método estático na class Thread chamado setDefaultUncaughtExceptionHandler . Fazer isso fará com que o manipulador de exceções para o aplicativo seja executado. Será o padrão para qualquer novo encadeamento, a menos que seja especificado de outra forma.

Intereting Posts