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));
}
}
}
以下技巧对我有用:
最新的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 方法的代码完成。 吞没和方法抛出的异常是一个好主意吗?如果没有,什么是处理上述情况的更好方法,以免吞下异常? 问题答案: 我不喜欢捕捉和抛出异常。 如果你抓住它,做 一些 与它-即使它只是记录例外。 如果您不能执行任何操作,请不要捕获它-在方