如何从java swing向log4j日志发送异常?
我们已经完成了很多代码并且它做了很多:
mytable.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
... no try catch
}
});
没有尝试/捕获。应用程序向控制台发送npe异常。我们在log4j中需要它。但是不想改变所有这些代码(像这样的100行)。我们能做什么?
答案 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());
此解决方案的优点是只捕获图形,当您必须在图形异常(包括事件处理程序)和其他可能的异常之间存在差异时,可以提供更大的灵活性。
问候!