在Google Guava EventBus中引发异常

时间:2016-05-10 06:25:55

标签: java guava event-bus

Google Guava EventBus吞下异常并记录它们。

我写了一个非常简单的应用来解释我的方法:

public class SimplePrinterEvent {
 @Subscribe
 public void doPrint(String s) {
    int a = 2/0; //This is to fire an exception
    System.out.println("printing : " + s );
  }
}

演示

public class SimplePrinterEventDemo {
  public static void main(String[] args) {

    EventBus eventBus = new EventBus();
    eventBus.register(new SimplePrinterEvent());
    try{
        eventBus.post("This is going to print");
    }
    catch(Exception e){
        System.out.println("Error Occured!");
    }
  }
}

这永远不会来到捕获区!

所以我添加了一个SubscriberExceptionHandler并覆盖了handleException()。

EventBus eventBus = new EventBus(new SubscriberExceptionHandler() {

        @Override
        public void handleException(Throwable exception,
                SubscriberExceptionContext context) {
            System.out.println("Handling Error..yes I can do something here..");
            throw new RuntimeException(exception);
        }
    });

它允许我在处理程序中处理异常,但我的要求是将该异常带到顶层,我处理它们。

编辑:我在一些网站上找到的旧解决方案。 (这与番石榴v18合作)

public class CustomEventBus extends EventBus {
@Override
void dispatch(Object event, EventSubscriber wrapper) {
    try {
        wrapper.handleEvent(event);
    } catch (InvocationTargetException cause) {
        Throwables.propagate(Throwables.getRootCause(cause));
    }
 }
}

1 个答案:

答案 0 :(得分:3)

以下技巧对我有用:

最新的EventBus类有一个名为handleSubscriberException()的方法,您需要在扩展的EventBus类中覆盖它: (这里我已经包含了两个解决方案,只有一个适用于您的版本)

public class CustomEventBus extends EventBus {
  //If version 18 or bellow
  @Override
  void dispatch(Object event, EventSubscriber wrapper) {
    try {
        wrapper.handleEvent(event);
    } catch (InvocationTargetException cause) {
        Throwables.propagate(Throwables.getRootCause(cause));
    }
  }
  //If version 19
  @Override
  public void handleSubscriberException(Throwable e, SubscriberExceptionContext context) {
    Throwables.propagate(Throwables.getRootCause(e));
  }
}