Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Eclipse RCP应用程序中的全局异常处理_Java_Logging_Eclipse Rcp - Fatal编程技术网

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控制台输出