2008-09-18 7 views

ответ

10

Существует различие между неперехваченными исключениями в EDT и вне EDT.

Another question has a solution for both но если вы хотите только часть EDT разжевал ...

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

Не нужно ловить бросок. Не будет бесконечного цикла. java.awt.EventDispatchThread.handleException улавливает любые исключения для вас. –

+0

Там говорится 'классы AWTExceptionHandler' –

0

Есть два способа:

  1. /* Установите Thread.UncaughtExceptionHandler на EDT */
  2. Установить системное свойство: System.setProperty ("sun.awt.exception.handler", MyExceptionHandler.class.getName());

Я не знаю, работает ли последний на не-SUN jvms.

-

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

+1

Использование Thread.UncaufhtExceptionHandler не будет ловить исключения EDT. Класс EDT улавливает все комбайны и печатает их, а не позволяет разматывать весь поток. – shemnon

+0

Вы также не указали информацию о том, что необходимо во втором варианте, класс MyExceptionHandler должен иметь доступный метод экземпляра дескриптора (Throwable) и конструктор no-args. – shemnon

3

Немного дополнение к shemnon сек Anwer:
Первый раз неперехваченное RuntimeException (или ошибки) происходит в EDT ищет свойство «sun.awt.exception.handler» и пытается загрузить класс, связанный с этим свойством. EDT требует, чтобы класс Handler имел конструктор по умолчанию, иначе EDT не будет использовать его.
Если вам нужно привести немного большую динамику в историю обработки, вы вынуждены делать это со статическими операциями, потому что класс создается ЭДТ и поэтому не имеет доступа к другим ресурсам, отличным от статического. Вот код обработчика исключений из нашей среды Swing, которую мы используем. Это было написано для Java 1.4, и там хорошо работало:

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

} 

Надеюсь, это поможет.

10

Начиная с версии Java 7, вам нужно сделать это по-другому, так как ручка sun.awt.exception.handler больше не работает.

Here is the solution (from Uncaught AWT Exceptions 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()); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^