Pergunta

Nós gostaríamos um traço em nossos registros de aplicação destas excepções -. Por padrão Java apenas emite-los para o console

Foi útil?

Solução

Há uma distinção entre exceções.Ele do EDT e fora da EDT.

Outra questão tem uma solução para ambos mas se você quiser apenas a parte EDT mastigado ...

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

Outras dicas

Desde Java 7, você tem que fazê-lo de forma diferente como o hack sun.awt.exception.handler não funciona mais.

Aqui está a solução (de exceções.Ele AWT em 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());
    }
});

Um pouco além de Semnon s anwer:
A primeira vez que um RuntimeException não capturada (ou erro) ocorre no EDT ele está olhando para a propriedade "sun.awt.exception.handler" e tenta carregar a classe associada com a propriedade. EDT precisa a classe Handler ter um construtor padrão, caso contrário o EDT não vai usá-lo.
Se você precisa para trazer um pouco mais dinâmica na história manuseio você é forçado a fazer isso com operações estáticas, porque a classe é instanciado pela EDT e, portanto, não tem chance de acessar outros que não estática recursos. Aqui está o código manipulador de exceção de nosso quadro do balanço que estamos usando. Foi escrito para Java 1.4 e funcionou muito bem lá:

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

}

Hope isso ajuda.

Existem duas maneiras:

  1. / * Instalar um Thread.UncaughtExceptionHandler no EDT * /
  2. Definir uma propriedade do sistema: System.setProperty ( "sun.awt.exception.handler", MyExceptionHandler.class.getName ());

Eu não sei se os últimos trabalhos nas JVMs não-sol.

-

Na verdade, o primeiro não é correto, é apenas um mecanismo para detectar uma linha caiu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top