处理程序吞下例外

时间:2017-11-07 13:17:21

标签: eclipse-plugin

考虑以下处理程序:

public class CreateProjectHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        // it does not matter what kind of exception this is:
        throw new IllegalArgumentException("This is a test!");
    }

}

从客户和开发人员的角度来看,执行此处理程序时应该发生的事情非常清楚:应该弹出某种错误消息。

会发生什么:没什么。

更准确:将异常记录到错误日志(和控制台,如果从Eclipse启动)。但是用户什么也看不见,实际上他甚至不知道有错误。

我可以通过为每个处理程序捕获Exception来解决这个问题,但除了丑陋和繁琐之外,它还与每个样式指南相矛盾。

有没有更好的方法来处理处理程序吞下的异常?

2 个答案:

答案 0 :(得分:1)

对于Eclipse 4(e4或3.x兼容模式),将一个实现IEventLoopAdvisor的类添加到应用程序上下文中。将为未处理的异常调用eventLoopException方法。

为e4设置此选项的合适位置是RCP生命周期类的@PostContextCreate

@PostContextCreate
public void postContextCreate(IEclipseContext context)
{
  // Event loop advisor for error handling

  context.set(IEventLoopAdvisor.class, new EventLoopAdvisor());

您还必须实施eventLoopIdle,调用display.sleep()非常重要。标准方法是:

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

对于3.x兼容模式,在post上下文创建之后安装了一个默认的事件循环顾问程序,它委托给工作台WorkbenchAdvisor。如果您在RCP中使用自己的顾问,则可以覆盖顾问的eventLoopException方法。

答案 1 :(得分:0)

我找到了另一种适用于我的E3兼容性应用程序的方法:覆盖WorkbenchAdvisor#eventLoopException(Throwable)

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

    @Override
    public void eventLoopException(Throwable exception) {
        // do magic here
    }

    // [snipped other methods]
}