Java(SWT / JFace) - 处理Runnable中的所有异常

时间:2011-10-11 00:51:12

标签: java exception-handling swt jface

我有一个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 个答案:

答案 0 :(得分:7)

某些UI runnable在显示事件循环中抛出Exception。您需要设置不同的事件循环异常处理程序。 (默认情况下只是将异常打印到控制台。)

例如:

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

或者,当然,你可以像你的例子那样重新抛出并抓住你的顶层。

但请注意,这是Window上的静态方法,因此此异常处理程序为应用程序范围

答案 1 :(得分:0)

您的catch阻止只捕获Exception。但是,您没有说出抛出什么异常并且没有被捕获。因此,在没有任何进一步信息的情况下,我会猜测这些例外实际上是Error。请尝试使用catch (Throwable e)代替catch (Exception e)