2014-01-24 3 views
1

(Это Groovy 1.8.9. Проблема фиксируется в Groovy 2.1.0-RC-1)Обработка исключений в Groovy SwingBuilder.doOutside

Я пытаюсь обрабатывать исключения, которые происходят в SwingBuilder.doOutside{}. Я использовал Thread.setDefaultUncaughtExceptionHandler(), но, похоже, он не перехватывает нечеткие исключения в doOutside{}.

Вот пример программы, которая иллюстрирует проблему. Если я запустил это из командной строки и нажал кнопку EDT Exception, я вижу результаты printStackTrace() на stderr. Если я нажму Внешнее исключение, ничего не отображается. Что я делаю не так?

import groovy.swing.SwingBuilder 

class ExceptionTest { 
    static main(args) { 
     Thread.setDefaultUncaughtExceptionHandler(
      { thread, exception -> 
       System.err.println "thread ${thread.getName()}" 
       exception.printStackTrace() 
      } as Thread.UncaughtExceptionHandler) 

     def swing = new SwingBuilder() 

     def testEDTButton = swing.button('EDT exception') 
     testEDTButton.actionPerformed = { throw new Exception("EDT exception") } 

     def testOutsideButton = swing.button('Outside Exception') 
     testOutsideButton.actionPerformed = { swing.doOutside { throw new Exception("Exception outside") } } 

     def frame = swing.frame(title: 'Test exception reporting') { 
      vbox { 
       widget(testEDTButton) 
       widget(testOutsideButton) 
      } 
     } 
     frame.pack() 
     frame.show() 
    } 
} 

ответ

0

Я смотрел на источник SwingBuilder для Groovy 1.8.9, и получается, что doOutside использует ExecutorService.submit(), если он вызывается из EDT нити:

private static final ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) 
... 
DEFAULT_EXECUTOR_SERVICE.submit(c) 

The submit() возвращает Future, который отбрасывается, как вы можете видеть выше. A Future задерживает его исключения и выдает только исключение, если вы вызываете Future.get(). Но этого никогда не бывает в doOutside().

Так что мне нужно положить пробку в закрытие, я перехожу на doOutside(), чтобы иметь возможность заметить, что там произошло исключение.

ПРИМЕЧАНИЕ: Future был заменен простым Thread.start() в Groovy 2.1.0-rc-1 (см. Ошибку http://jira.codehaus.org/browse/GROOVY-5074). Это устраняет проблему захвата исключений.

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

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