6

我想在我的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用户显示的异常。那么如何正确覆盖/更改全局异常处理,以便使用我的代码(日志)而不是默认代码?

4

2 回答 2

2

我建议你使用org.eclipse.ui.statusHandlers扩展点

于 2012-11-07T13:04:07.807 回答
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 个控制台输出。

于 2012-11-07T17:38:33.010 回答