practices practice handling hackerrank example custom catch best java exception exception-handling

practice - Java: controlador global de excepciones



java exception hierarchy (6)

¿Hay alguna manera de crear un controlador de excepción global en Java? Quiero usar esto:

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

El controlador no puede detectar las excepciones lanzadas en un cuerpo de try-catch .

Martijn


Aquí hay un ejemplo que usa Logback para manejar cualquier excepción no detectada:

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 se puede hacer por subprocesos utilizando Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)


DefaultUncaughtExceptionHandler es la respuesta correcta. Jeff Storey me lo reveló en this lugar, hace unos días. Como sospechaba, este manejador nunca atrapará las excepciones capturadas "manualmente". Sin embargo, recibí la siguiente advertencia:

** - Para cumplir con J2EE, una aplicación web no debe usar ningún hilo. **

cuando revisé mi proyecto en función de las buenas prácticas y el estilo de codificación Java recomendado con el complemento PMD para Eclipse IDE.


Para su 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 Thread.

Para casos donde no tiene un punto de entrada bien definido para el subproceso, por ejemplo, cuando se está ejecutando en un servidor web o contexto de servidor de aplicaciones u otro marco donde la configuración y el desmontaje se manejan fuera de su código, mire para ver 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 elaborada, consulte http://metatations.com/2011/11/20/global-exception-handling-in-java/



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 hilo creado por javax.naming.spi.NamingManager.getInitialContext () cuando se utiliza una URL LDAP, utilizando JavaSE 1.6. Sin duda hay otras excepciones.