【问题标题】:Capture exception in swing thread在摆动线程中捕获异常
【发布时间】:2011-08-29 14:39:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java swing exception-handling


    【解决方案1】:

    您可以设置一个未捕获异常处理程序,该处理程序将记录您的应用程序抛出的任何内容。

    在 Swing 应用程序的 main 方法中添加以下行:

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

    【讨论】:

    • sun.awt.exception.handler 用于在有模态对话框时捕获异常。对吗?
    • @James:是的。但显然使用 jdk7 不再需要了
    • JDK7 在发布时存在一些错误,因此 JDK6 很可能仍然是主流。
    • 很好的答案 - tx;跟进:当这个异常发生时,我们观察到奇怪的绘画行为;是因为我们正在挥杆并中断正常的油漆/更新吗?在抛出的窗口中,我们开始在奇怪的地方看到按钮,滚动条出现多次。如果是这样怎么办?尝试/抓住每个摇摆听众?或者这里的solition也可以帮助解决奇怪的油漆问题?
    【解决方案2】:

    你也可以像下面这个例子一样包装 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()));
            }
        }
    }
    

    在编写完这个类之后,你可以使用下面的代码来安装 wrap:

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

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

    问候!

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2015-06-19
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多