2011-08-29 79 views
5

如何從java swing發送異常到log4j日誌?擺動線程捕獲異常

我們有太多的代碼已經完成,並做了很多:

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

沒有try/catch語句。應用程序向控制檯發送npe異常。我們在log4j中需要它。但不想改變所有這些代碼(像這樣的100行)。我們可以做什麼?

回答

7

您可以設置一個未捕獲的異常處理程序,它將記錄應用程序拋出的任何東西。

在您的Swing應用程序的主要方法加上這些行:

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

然後實現異常處理是這樣的:

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

第二行('System.setProperty ...')是強制的嗎? – umbr

+0

sun.awt.exception.handler在存在模態對話框時捕獲異常。正確? –

+0

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

1

你也可以換到EventQueue就像這個例子: Catch exceptions in javax.swing application

如果你還想記錄異常,在這裏我給你其他的選擇,也許有更多的代碼,但它工作正常。

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())); 
     } 
    } 
} 

後你的代碼這個類,你可以用下面的線安裝包:

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

這個解決方案有隻捕獲圖形的優勢,讓您有更多的靈活性,當你有differentite圖形異常(包括事件處理程序)和其他可能的異常之間。

問候!