eclipse e4应用程序中的自定义错误对话框

时间:2018-01-11 14:37:29

标签: java eclipse eclipse-plugin eclipse-rcp e4

我正在尝试更改e4应用程序的默认状态处理程序,因为我想向其添加完整的堆栈跟踪。

到目前为止,我在插件xml中添加了以下代码:

<extension
    point="org.eclipse.ui.statusHandlers"> 
 <statusHandler
        class="our.test.StatusHandler"
        id="custom_status_handler"/>
  <statusHandlerProductBinding
        handlerId="custom_status_handler"
        productId="my_product.product">
  </statusHandlerProductBinding>
</extension>

类our.test.StatusHandler如下所示:

public class StatusHandler extends AbstractStatusHandler {

    @Override
    public void handle(StatusAdapter statusAdapter, int style) {
        System.out.println("Hello World");
    }
}

但这似乎不起作用。仍显示默认的错误对话框,控制台中没有输出。

我已经查看了this回答并使用了WorkbenchErrorHandler而不是AbstractStatusHandler,但它也不起作用。

1 个答案:

答案 0 :(得分:1)

StatusHandler是3.x兼容模式,不在纯e4应用程序中使用。

您可以通过在应用程序上下文中添加IEventLoopAdvisor的实现来处理未处理的异常。 RCP LifeCycle类的@PostContextCreate方法是一个很好的地方:

@PostContextCreate
public void postContextCreate(IEclipseContext context)
{
  context.set(IEventLoopAdvisor.class, new EventLoopAdvisor(context));

  ...
}

class EventLoopAdvisor implements IEventLoopAdvisor
{
  private final IEclipseContext _appContext;

  EventLoopAdvisor(IEclipseContext appContext)
  {
    super();

    _appContext = appContext;
  }

  @Override
  public void eventLoopIdle(final Display display)
  {
    display.sleep();
  }

  @Override
  public void eventLoopException(final Throwable exception)
  {
    // Report error
  }
}

请注意,display.sleep()中对eventLoopIdle的调用非常重要。