当前位置: 首页 > 知识库问答 >
问题:

在Google Guava EventBus中引发异常

金和雅
2023-03-14

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个答案

温亮
2023-03-14

以下技巧对我有用:

最新的EventBus类有一个名为HandleSubscribereException()的方法,您需要在扩展的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));
  }
}
 类似资料:
  • 我正尝试在类的方法中使用(以支持拖放)。我想显示我拖动的文件的导入进度。然而,它并不起作用。我不明白问题是什么,或者是什么引起的。 例外情况:

  • 问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处:

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 我遵循了android开发者参考文件提供者上的示例代码,但它不起作用。 我已经在清单中的文件提供程序定义中设置了路径,并且引用的文件确实存在于该路径中。 在我的清单中: 在 然后我尝试用下面的代码获取内容uri: 但是我得到了这个错误: 最新消息 从Android的源代码,我可以追捕到目前为止,因为我现在知道这个命令在将失败并返回: 但我不知道为什么。。。

  • 问题内容: 通常,我会遇到必须吞下/ 块中清理代码所引发的异常以防止原始异常被吞咽的情况。 例如: 假设记录任何异常不是方法块范围内的选项,而是由调用and 方法的代码完成。 吞没和方法抛出的异常是一个好主意吗?如果没有,什么是处理上述情况的更好方法,以免吞下异常? 问题答案: 我不喜欢捕捉和抛出异常。 如果你抓住它,做 一些 与它-即使它只是记录例外。 如果您不能执行任何操作,请不要捕获它-在方