Java (SWT / JFace) - обработка всех исключений в Runnable - PullRequest
1 голос
/ 11 октября 2011

У меня есть приложение SWT / JFace, которое использует класс Realm (не уверен в концепции) для запуска основной программы в виде потока. Я пытаюсь перехватить любые необработанные исключения, используя блок try / catch вокруг моего основного кода:

public static void main(String args[]) {
    // ref: http://forums.instantiations.com/viewtopic.php?f=1&t=1583
    Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
        public void run() {
            try {
                PropertyConfigurator.configure("log4j.properties");
                MainWindow window = new MainWindow();
                window.setBlockOnOpen(true);
                window.open();
                Display.getCurrent().dispose();
            } catch (Exception e) {
                MessageDialog.openError(null, "Error", "Error occurred: " + e.getMessage());
                logger.error("Error!!!", e);
                e.printStackTrace();
            }
        }
    });
}

Ошибки возвращаются обратно в строку window.open(), но затем передаются в Realm, поэтому блок catch никогда не достигается. Вот конец трассировки стека:

at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
at org.eclipse.jface.window.Window.open(Window.java:801)
at com.ism.MainWindow$1.run(MainWindow.java:210) <-- "window.open();"
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at com.ism.MainWindow.main(MainWindow.java:204) <-- "Realm.runWithDefault....."

Пытался выставить попытку / поймать Realm.runWithDefault, но это тоже не сработало.

Как мне перехватить все исключения в этом случае?

Ответы [ 2 ]

7 голосов
/ 13 октября 2011

Некоторый пользовательский интерфейс запускает Exception в цикле отображения событий. Вам нужно настроить другой обработчик исключений цикла событий. (По умолчанию просто выводится исключение на консоль.)

Например:

Window.setExceptionHandler(new Window.IExceptionHandler() {
    public void handleException(Throwable error) {
        MessageDialog.openError(null, "Error", "Error: " + error.getMessage());
    }
});

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

Обратите внимание, однако, что это статический метод в Window, поэтому этот обработчик исключений для всего приложения .

0 голосов
/ 14 октября 2011

Ваш catch блок только ловит Exception с. Тем не менее, вы не говорите, какие исключения были выброшены и не были пойманы. Таким образом, при отсутствии какой-либо дополнительной информации, я собираюсь предположить, что эти исключения на самом деле Error с. Попробуйте catch (Throwable e) вместо catch (Exception e).

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