2009-10-10 15 views
36

¿Existe alguna forma de crear un manejador de excepción global en Java? Quiero usar la siguiente manera:Java: Controlador global de excepciones

"When an exception is thrown somewhere in the WHOLE program, exit." 

El controlador no puede atrapar excepciones producidas en un cuerpo try-catch.

Martijn

Respuesta

0

DefaultUncaughtExceptionHandler es la respuesta correcta. Me fue revelado por Jeff Storey en this ubicación, hace unos días. Como sospechaba, este manejador nunca atrapará las excepciones capturadas "manualmente". Sin embargo me dieron la siguiente advertencia:.

** - Para ser compatible con J2EE, una aplicación web no debe utilizar cualquier hilo **

cuando he comprobado mi proyecto en relación con la buena práctica y recomendó estilo de código Java con PMD plug-in para Eclipse IDE.

+0

"** - Para cumplir con J2EE, una aplicación web no debe usar ningún hilo. **" - No estoy al tanto de esto. ¿Quiere decir que el método service() (y doGet(), doPost(), etc.) en un servlet no debería generar nuevos hilos? – Kolibri

+0

No tengo idea de lo que eso significa, ya que mi aplicación no está basada en la web. Lo busqué en google por un tiempo, y no encontré ninguna respuesta, tengo miedo. Además de advertencias como esta o "nombre de variable es demasiado corto" o "nombre de variable es demasiado largo", he fundado PMD para ser una gran fuente de inspiración. Lo recomiendo encarecidamente – hypercube

+1

Investigué un poco, y aparentemente no se pueden crear hilos directamente en J2EE. He encontrado un par de enlaces: http://www.theserverside.com/discussions/thread.tss?thread_id=44353 y http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee -container-is-disouraged – Kolibri

1

Para aclaración, use setDefaultUncaughtExceptionHandler para aplicaciones Java independientes o para instancias donde esté seguro de que tiene un punto de entrada bien definido para el subproceso.

Para casos donde no tiene un punto de entrada bien definido para el subproceso, por ejemplo, cuando se ejecuta en un servidor web o servidor de aplicaciones u otro marco donde la configuración y desmontaje se manejan fuera de su código , observe cómo ese marco maneja las excepciones globales. Por lo general, estos marcos tienen sus propios manejadores de excepciones globales establecidos en los que se convierte en participante, en lugar de definirlos.

Para una discusión más detallada, consulte http://metatations.com/2011/11/20/global-exception-handling-in-java/

2

He aquí un ejemplo que utiliza Logback para manejar las excepciones no capturadas:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e); 
     System.exit(1); 
    } 
}); 

Esto también puede hacerse sobre una base por hilo usando Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

0

Threads.setDefaultUncaughtExceptionHandler() funciona pero no en todos los casos. Por ejemplo, lo estoy usando en mi main() antes de crear widgets Swing, y funciona en los hilos creados por Swing, como el hilo de evento AWT o los hilos SwingWorker.

Lamentablemente, no tiene ningún efecto en el subproceso creado por javax.naming.spi.NamingManager.getInitialContext() cuando se utiliza una URL LDAP, utilizando JavaSE 1.6. Sin duda hay otras excepciones.

Cuestiones relacionadas