我想在我的RCP
应用中覆盖全局异常处理。每当发生未被捕获的异常时,我想记录它(使用java
日志记录),然后退出应用程序。我已经覆盖了eventLoopException(Throwable exception)
类中的ApplicationWorkbenchAdvisor
方法。但这只捕获事件循环异常。截至目前,我还覆盖了postStartup()
这样的方法:
public void postStartup()
{
Policy.setStatusHandler(new StatusHandler()
{
@Override
public void show(IStatus status, String title)
{
LOGGER.log(Level.SEVERE, "Uncaught Exception", status.getException());
UnexpectedErrorDialog();
PlatformUI.getWorkbench().close();
}
});
}
它将异常记录在我的日志文件中并退出应用程序。但它显然不对,并且在控制台中显示两次异常,因为我所做的只是在gui dialog
中拦截向用户显示异常。那么如何才能正确覆盖/更改全局异常处理,以便使用我的代码(log)而不是默认代码?
答案 0 :(得分:2)
我建议你使用org.eclipse.ui.statusHandlers
扩展点
答案 1 :(得分:2)
感谢sambi reddy的提示,我现在已经在ApplicationWorkbenchAdvisor类中覆盖了AbstractStatusHandler
@Override
public synchronized AbstractStatusHandler getWorkbenchErrorHandler() {
if (myStatusHandler == null) {
myStatusHandler = new MyStatusHandler();
}
return myStatusHandler;
}
MyStatusHandler扩展了AbstractStatusHandler,我已经覆盖了这样的句柄方法:
@Override
public void handle(StatusAdapter statusAdapter, int style)
{
if(statusAdapter.getStatus().matches(IStatus.ERROR) && ((style != StatusManager.NONE)))
{
LOGGER.log(Level.SEVERE, "Uncaught Exception", statusAdapter.getStatus().getException());
UnexpectedErrorDialog();
PlatformUI.getWorkbench().close();
}
}
似乎工作正常,唯一的缺点是我仍然得到2个控制台输出。