Guava EventBus: не перехватывать RuntimeException - PullRequest
8 голосов
/ 10 февраля 2012

Я использую EventBus от guava, к сожалению, он ловит и регистрирует исключение InvocationTargetException, возникающее, когда обработчик события генерирует исключение RuntimeException. Могу ли я отключить это поведение?

Ответы [ 3 ]

8 голосов
/ 11 февраля 2012

В нынешнем виде это преднамеренное решение, которое обсуждается в документах EventBus:

Обычно обработчики не должны выбрасывать.Если они это сделают, EventBus будет ловить и регистрировать исключение.Это редко является правильным решением для обработки ошибок и на него нельзя полагаться;он предназначен исключительно для того, чтобы помочь найти проблемы во время разработки.

Альтернативные решения рассматриваются , хотя я серьезно сомневаюсь, что они появятся в выпуске 12.

4 голосов
/ 30 октября 2014

Вот код для ленивых

public class Events
{
    public static EventBus createWithExceptionDispatch()
    {
        final EventBus bus;

        MySubscriberExceptionHandler exceptionHandler = new MySubscriberExceptionHandler();
        bus = new EventBus(exceptionHandler);
        exceptionHandler.setBus(bus);
        return bus;
    }

    private static class MySubscriberExceptionHandler implements SubscriberExceptionHandler
    {
        @Setter
        EventBus bus;

        @Override
        public void handleException(Throwable exception, SubscriberExceptionContext context)
        {
            ExceptionEvent event = new ExceptionEvent(exception, context);
            bus.post(event);
        }
    }
}

Теперь вы можете подписаться ExceptionEvent.

Вот мой ExceptionEvent для копирования и вставки

@Data
@Accessors(chain = true)
public class ExceptionEvent
{
    private final Throwable exception;
    private final SubscriberExceptionContext context;
    private final Object extra;

    public ExceptionEvent(Throwable exception)
    {
        this(exception, null);
    }

    public ExceptionEvent(Throwable exception, Object extra)
    {
        this(exception,null,extra);
    }

    public ExceptionEvent(Throwable exception, SubscriberExceptionContext context)
    {
        this(exception,context,null);
    }

    public ExceptionEvent(Throwable exception, SubscriberExceptionContext context, Object extra)
    {
        this.exception = exception;
        this.context = context;
        this.extra = extra;
    }
}
0 голосов
/ 29 ноября 2016

Просто унаследуйте guava EventBus и напишите свой собственный EventBus.Советы: этот класс должен записываться в пакет com.google.common.eventbus, чтобы внутренний метод можно было перезаписать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...