Java Eclipse RCP应用程序中的全局异常处理
我想覆盖我的Java Eclipse RCP应用程序中的全局异常处理,java,logging,eclipse-rcp,Java,Logging,Eclipse Rcp,我想覆盖我的RCP应用程序中的全局异常处理。每当发生未捕获的异常时,我都要记录它(使用javalogging),然后退出应用程序。我已经覆盖了ApplicationWorkbenchHadVisor类中的eventLoopException(Throwable exception)方法。但这只捕获事件循环异常。到目前为止,我还覆盖了postStartup()方法,如下所示: public void postStartup() { Policy.setStatusHandler(new S
RCP
应用程序中的全局异常处理。每当发生未捕获的异常时,我都要记录它(使用java
logging),然后退出应用程序。我已经覆盖了ApplicationWorkbenchHadVisor
类中的eventLoopException(Throwable exception)
方法。但这只捕获事件循环异常。到目前为止,我还覆盖了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();
}
});
}
@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();
}
}
它将异常记录在我的日志文件中并退出应用程序。但这显然是不对的,异常会在控制台中显示两次,因为我所做的只是截取
gui对话框中向用户显示的异常。那么,如何正确地覆盖/更改全局异常处理,以便使用我的代码(日志)而不是默认代码?我建议您使用org.eclipse.ui.statusHandlers
扩展点多亏了sambi reddy的提示,我现在已经覆盖了ApplicationWorkbenchAdvisor类中的AbstractStatusHandler
@Override
public synchronized AbstractStatusHandler getWorkbenchErrorHandler() {
if (myStatusHandler == null) {
myStatusHandler = new MyStatusHandler();
}
return myStatusHandler;
}
MyStatusHandler扩展了AbstractStatusHandler,我覆盖了handle方法,如下所示:
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();
}
});
}
@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控制台输出