Java(SWT/JFace)-处理Runnable中的所有异常
我有一个SWT/JFace应用程序,它使用Realm(不确定概念)类作为线程运行主程序。我试图在主代码周围使用try/catch块捕获任何未捕获的异常:Java(SWT/JFace)-处理Runnable中的所有异常,java,exception-handling,swt,jface,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),
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();
}
}
});
}
错误会被抛出回窗口。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....."
org.eclipse.jface.window.window.runEventLoop(window.java:825)上的
位于org.eclipse.jface.window.window.open(window.java:801)
在com.ism.MainWindow$1.run(MainWindow.java:210)上,一些UI runnable正在显示事件循环中抛出一个异常。您需要设置不同的事件循环异常处理程序。(默认设置只是将异常打印到控制台。)
例如:
Window.setExceptionHandler(new Window.IExceptionHandler() {
public void handleException(Throwable error) {
MessageDialog.openError(null, "Error", "Error: " + error.getMessage());
}
});
当然,你也可以像你的例子中那样,在你的顶级水平上重新起球并接球
但是,请注意,这是窗口上的一个静态方法,因此此异常处理程序是应用程序范围的一些可运行的UI正在显示事件循环中抛出一个异常。您需要设置不同的事件循环异常处理程序。(默认设置只是将异常打印到控制台。)
例如:
Window.setExceptionHandler(new Window.IExceptionHandler() {
public void handleException(Throwable error) {
MessageDialog.openError(null, "Error", "Error: " + error.getMessage());
}
});
当然,你也可以像你的例子中那样,在你的顶级水平上重新起球并接球
但是,请注意,这是窗口上的一个静态方法,因此此异常处理程序是应用程序范围的您的catch
块仅捕获异常。但是,您并没有说明哪些异常被抛出,哪些异常没有被捕获。因此,在没有任何进一步信息的情况下,我猜测这些异常实际上是Error
s。尝试catch(Throwable e)
而不是catch(Exception e)
您的catch
块仅捕获异常。但是,您并没有说明哪些异常被抛出,哪些异常没有被捕获。因此,在没有任何进一步信息的情况下,我猜测这些异常实际上是Error
s。尝试catch(Throwable e)
而不是catch(Exception e)
你所说的“返回到window.open()
line fine”是什么意思?你所说的“返回到window.open()
line fine”是什么意思?完整的堆栈跟踪会很方便。到目前为止,如果抛出的NPE被包装成一个错误
,则看起来是人工智能。完整的堆栈跟踪会很方便。到目前为止,如果抛出的NPE被包装到一个错误中,似乎是人工智能。对于我最初的try/catch为什么不起作用,仍然感到困惑,但您给出的示例很有效。事件循环的默认异常处理程序只调用e.printStackTrace()
。因此,在window.open()
调用中,实际上没有任何东西被抛出给您。对于我最初的try/catch为什么不起作用,仍然感到困惑,但您给出的示例很好。事件循环的默认异常处理程序只调用e.printStackTrace()
。所以在window.open()
调用中实际上没有任何东西被抛出给您。