我有一个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
附近试试/捕捉,但这也不起作用。
如何在这种情况下捕获所有异常?
答案 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)
。