2011-08-29 9 views
5

¿Cómo enviar una excepción al log4j log desde java swing?Excepción de captura en el hilo oscilante

Tenemos mucho código ya hecho y lo hace mucho:

mytable.getSelectionModel().addListSelectionListener(
     new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       ... no try catch 
      } 
     }); 

No hay try/catch. La aplicación envía una excepción npe a la consola. Lo necesitamos en log4j. Pero no quiero cambiar todo este código (cientos de líneas como esta). ¿Qué podemos hacer?

Respuesta

7

Puede configurar un controlador de excepción no detectada que registrará todo lo que arroje su aplicación.

En el método principal de su aplicación Swing de añadir estas líneas:

Thread.setDefaultUncaughtExceptionHandler(new LoggingExceptionHandler()); 
System.setProperty("sun.awt.exception.handler", LoggingExceptionHandler.class.getName()); 

luego implementar el de excepciones de la siguiente manera:

package com.initech.tps; 

import java.lang.Thread.UncaughtExceptionHandler; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class LoggingExceptionHandler implements UncaughtExceptionHandler 
{ 

    private static final Logger logger = LoggerFactory.getLogger(LoggingExceptionHandler.class); 

    @Override 
    public void uncaughtException(Thread t, Throwable e) 
    { 
     logger.error("caught exception in thread: " + t.getName(), e); 
    } 
} 
+0

¿Es obligatoria la segunda línea ('System.setProperty ...')? – umbr

+0

sun.awt.exception.handler capturará Excepciones cuando haya un cuadro de diálogo modal. ¿Correcto? –

+0

@umbr: vea http://stackoverflow.com/questions/5794472/why-bother-with-setting-the-sun-awt-exception-handler-property –

1

También puede envolver el EventQueue como en este ejemplo: Catch exceptions in javax.swing application

Si también desea registrar la excepción, aquí le doy otra opción, tal vez con más código, pero funciona correctamente.

import java.awt.AWTEvent; 
import java.awt.EventQueue; 

import javax.swing.JOptionPane; 

import org.slf4j.Logger; 


public class QueueEvenement extends EventQueue { 
    // CONSTRUCTOR 
    public QueueEvenement(Logger logger) { 
     super(); 
     this.logger = logger; 
    } 


    protected void dispatchEvent(AWTEvent newEvent) { 
     try { 
      super.dispatchEvent(newEvent); 
     } catch (Throwable t) { 
      // Write log 
      logger.error(String.format("Erreur inconnue (%s - %s)", 
        t.getClass().getName(), t.getLocalizedMessage())); 
     } 
    } 
} 

Después de codificar esta clase, puede instalar la envoltura con la siguiente línea:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy()); 

Esta solución tiene la ventaja de captura sólo el gráfico, que le da una mayor flexibilidad cuando se tiene que differentite entre excepciones gráficas (incluidos los manejadores de eventos) y las otras posibles excepciones.

¡Recuerdos!

Cuestiones relacionadas