gpt4 book ai didi

java - Google Guava EventBus 和事件处理程序中的异常

转载 作者:搜寻专家 更新时间:2023-11-01 01:16:11 26 4
gpt4 key购买 nike

Guava EventBus 文档说“处理程序通常不应抛出异常。如果抛出异常,EventBus 将捕获并记录异常。这很少是错误处理的正确解决方案,不应依赖;它仅用于帮助发现问题在开发过程中。”

如果您知道可能会发生某些异常,您可以向 EventBus 注册一个 SubscriberExceptionHandler 并使用它来处理这些异常。

但是如果发生未处理的异常会怎样呢?通常,我想要一个未处理的异常来“冒泡”调用链。使用 SubscriberExceptionHandler 时,我可以访问在事件处理程序中抛出的原始异常,我只想重新抛出它。但我想不通。

那么,无论是否使用 SubscriberExceptionHandler,如何确保事件处理程序中的意外异常不会被“吞噬”?

如有任何帮助,我们将不胜感激。

最佳答案

Guava 不会让异常冒泡。它被迫在 exceptionHandler 内部停止。请参阅下面的源代码。

      /**
* Handles the given exception thrown by a subscriber with the given context.
*/
void handleSubscriberException(Throwable e, SubscriberExceptionContext context) {
checkNotNull(e);
checkNotNull(context);
try {
exceptionHandler.handleException(e, context);
} catch (Throwable e2) {
// if the handler threw an exception... well, just log it
logger.log(
Level.SEVERE,
String.format(Locale.ROOT, "Exception %s thrown while handling exception: %s", e2, e),
e2);
}
}

我在 github 上发布了一个问题。您可以继承 EventBus 并编写自己的异常处理逻辑。

package com.google.common.eventbus;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.SubscriberExceptionContext;

/**
* A eventbus wihch will throw exceptions during event handle process.
* We think this behaviour is better.
* @author ytm
*
*/
public class BetterEventBus extends EventBus {

public BetterEventBus() {}

/**
* Creates a new EventBus with the given {@code identifier}.
*
* @param identifier a brief name for this bus, for logging purposes. Should be a valid Java
* identifier.
*/
public BetterEventBus(String identifier) {
super(identifier);
}

/**
* Just throw a EventHandleException if there's any exception.
* @param e
* @param context
* @throws EventHandleException
*/
@Override
protected void handleSubscriberException(Throwable e, SubscriberExceptionContext context) throws EventHandleException {
throw new EventHandleException(e);
}
}

关于java - Google Guava EventBus 和事件处理程序中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33599690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com