在swing线程中捕获异常

时间:2011-08-29 14:39:18

标签: java swing exception-handling

如何从java swing向log4j日志发送异常?

我们已经完成了很多代码并且它做了很多:

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

没有尝试/捕获。应用程序向控制台发送npe异常。我们在log4j中需要它。但是不想改变所有这些代码(像这样的100行)。我们能做什么?

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分: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());

此解决方案的优点是只捕获图形,当您必须在图形异常(包括事件处理程序)和其他可能的异常之间存在差异时,可以提供更大的灵活性。

问候!