2011-12-02 14 views
10

Quiero definir un nivel de aplicación UncaughtExceptionHandler en mi aplicación Java que se invoca si se lanza una excepción no detectada en un hilo de mi aplicación. Sé que es posible definir una excepción no detectada para un grupo de hilos (ThreadGroup) y en realidad la estoy usando, pero quiero definir una excepción global no detectada para hilos que no tienen definido su propio manejador de excepciones no detectadas o que no están asociados a un grupo de subprocesos que tienen definido un manejador de excepción predeterminado.Definir un UncaughtExceptionHandler global para todos los hilos de mi aplicación

Así, por ejemplo, yo quiero llegar a algo como esto:

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

En términos simples quiero anular el valor predeterminado UncaughtExceptionHandler y definir mi propio controlador en lugar de imprimir el seguimiento de pila en el System.err (que es el valor predeterminado comportamiento).

Por ejemplo en C# .NET hago algo similar manejar la excepción controlador de eventos no controlada y hilo en el método Main() de la aplicación:

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

se puede hacer incluso en Java?

¿Cómo puedo sobrescribir el UncaughtExceptionHandler predeterminado en Java?

Respuesta

16

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

Esto debería lograr lo que busca.

A medida que el médico dice

Establecer el controlador predeterminado invoca cuando un subproceso termina abruptamente debido a una excepción no capturada, y ningún otro controlador se ha definido para ese hilo.

Y una nota interesante (también en el docs) con respecto a usted utilizando el controlador en el ThreadGroup

Tenga en cuenta que el controlador predeterminado de excepciones no detectadas no debe por lo general aplace a objeto ThreadGroup del hilo, como la podría causar una recursión infinita de .

+0

¿Esto es válido para todos los hilos de la aplicación o solo es válido para el hilo actual en el que está definido? ¿Debería definirse en el método principal de la aplicación? – aleroot

+1

Se establece como un campo estático en la clase Thread y no como un campo local de threads. Entonces sería válido para todos los hilos en la aplicación. Se puede definir en el método principal, pero es probable que desee definirlo dentro del bloque 'static' de la clase principal. –

+0

@JohnVint ¿Puedes actualizar la respuesta con el comentario anterior? Para mí fue fácil de entender cuando dijiste que es un campo estático en la clase Thread – Gerrard

4

Debe establecer el controlador de excepciones no detectadas predeterminado. Este es un método estático en la clase Thread llamado setDefaultUncaughtExceptionHandler. Al hacerlo, establecerá el manejador de excepciones para la aplicación en ejecución. Será el valor predeterminado para cualquier nuevo hilo a menos que se especifique lo contrario.

Cuestiones relacionadas