Захват исключения в качающейся нити - PullRequest
5 голосов
/ 29 августа 2011

Как отправить исключение в log4j log из java swing?

У нас уже много кода, и он делает много:

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

Нет попытки / улова. Приложение отправляет исключение npe на консоль. Нам это нужно в log4j. Но не хочу менять весь этот код (сотни строк, как это). Что мы можем сделать?

Ответы [ 2 ]

7 голосов
/ 29 августа 2011

Вы можете настроить обработчик необработанных исключений, который будет регистрировать все, что выбрасывается вашим приложением.

В основном методе вашего приложения 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 голос
/ 30 августа 2011

Вы также можете обернуть EventQueue, как в этом примере: Перехват исключений в приложении javax.swing

Если вы хотите также зарегистрировать исключение, здесь я даю вам другой вариант, возможно, с большим количеством кода, но он работает правильно.

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

Преимущество этого решения заключается в захвате только графики, что дает вам больше гибкости, когда вам приходится различать графические исключения (включая обработчики событий) и другие возможные исключения.

Привет! * * 1013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...