Frage

Wir möchten eine Spur in unserem Anwendungsprotokolle dieser Ausnahmen -. Standardmäßig Java gibt sie nur an die Konsole

War es hilfreich?

Lösung

Es gibt einen Unterschied zwischen abgefangene Ausnahmen im EDT und außerhalb des EDT.

Eine andere Frage hat eine Lösung, die sowohl für aber wenn Sie nur die EDT Teil wollen gekaut ...

class AWTExceptionHandler {

  public void handle(Throwable t) {
    try {
      // insert your exception handling code here
      // or do nothing to make it go away
    } catch (Throwable t) {
      // don't let the exception get thrown out, will cause infinite looping!
    }
  }

  public static void registerExceptionHandler() {
    System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
  }
}

Andere Tipps

Da Java 7, haben Sie es anders machen als der sun.awt.exception.handler Hack funktioniert nicht mehr.

Hier ist die Lösung (von Uncaught AWT Ausnahmen in Java 7 ).

// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());

// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
    public void run()
    {
        // We are in the event dispatching thread
        Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
    }
});

Ein wenig neben shemnon s anwer:
Das erste Mal, wenn ein nicht abgefangene Runtime (oder Fehler) im EDT kommt es für die Eigenschaft „sun.awt.exception.handler“ sucht und versucht, die Klasse mit dem Eigentum verbunden zu laden. EDT braucht die Handler-Klasse einen Standardkonstruktor zu haben, sonst wird der EDT wird es nicht verwenden.
Wenn Sie ein bisschen mehr Dynamik in die Handhabung Geschichte mitbringen müssen sind Sie gezwungen, diese mit statischen Operationen zu tun, weil die Klasse durch die EDT instanziiert wird und haben daher keine Möglichkeit, andere Ressourcen zugreifen andere als statisch. Hier ist der Exception-Handler-Code aus unserem Swing-Rahmen, den wir verwenden. Es wurde für Java geschrieben 1.4 und es funktionierte ganz da fein:

public class AwtExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);

    private static List exceptionHandlerList = new LinkedList();

    /**
     * WARNING: Don't change the signature of this method!
     */
    public void handle(Throwable throwable) {
        if (exceptionHandlerList.isEmpty()) {
            LOGGER.error("Uncatched Throwable detected", throwable);
        } else {
            delegate(new ExceptionEvent(throwable));
        }
    }

    private void delegate(ExceptionEvent event) {
        for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) {
            IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();

            try {
                handler.handleException(event);
                if (event.isConsumed()) {
                    break;
                }
            } catch (Throwable e) {
                LOGGER.error("Error while running exception handler: " + handler, e);
            }
        }
    }

    public static void addErrorHandler(IExceptionHandler exceptionHandler) {
        exceptionHandlerList.add(exceptionHandler);
    }

    public static void removeErrorHandler(IExceptionHandler exceptionHandler) {
        exceptionHandlerList.remove(exceptionHandler);
    }

}

Hoffe, es hilft.

Es gibt zwei Möglichkeiten:

  1. / * Installieren Sie eine Thread.UncaughtExceptionHandler am EDT * /
  2. Stellen Sie eine Systemeigenschaft: System.setProperty ( "sun.awt.exception.handler", MyExceptionHandler.class.getName ());

Ich weiß nicht, wenn diese Arbeiten auf nicht-SUN JVMs.

-

Tatsächlich ist die erste nicht richtig ist, es ist nur ein Mechanismus für einen abgestürzten Faden zu erkennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top