Używam EventBus guava, niestety przechwytuje i rejestruje wyjątek InvocationTargetException, który występuje, gdy event-handler zgłasza wyjątek RuntimeException. Czy mogę wyłączyć to zachowanie?Guava EventBus: nie łapię RuntimeException
8
A
Odpowiedz
8
W obecnej formie, jest to przemyślana decyzja i omówione w docs EventBus:
Rączki nie powinny w ogóle wyrzucić. Jeśli tak się stanie, EventBus złapie i zarejestruje wyjątek. To rzadko jest właściwe rozwiązanie do obsługi błędów i nie należy polegać na nim; jest przeznaczony wyłącznie do pomocy w znalezieniu problemów podczas programowania.
rozwiązania alternatywne są being considered, choć wątpię oni uczynić go do wydania 12.
4
Oto kod dla leniwych
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);
}
}
}
Teraz możesz zapisać ExceptionEvent
.
Oto moja ExceptionEvent
dla prostu skopiować & pasty
@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
Wystarczy dziedziczyć EventBus guawa i napisać jesteś właścicielem niestandardową eventbus. Wskazówki: Ta klasa powinna pisać w pakiecie com.google.common.eventbus, aby można było nadpisać metodę wewnętrzną.
package com.google.common.eventbus;
import com.google.common.util.concurrent.MoreExecutors;
public class CustomEventBus extends EventBus {
/**
* 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 CustomEventBus(String identifier) {
super(
identifier,
MoreExecutors.directExecutor(),
Dispatcher.perThreadDispatchQueue(),
LoggingHandler.INSTANCE);
}
/**
* Creates a new EventBus with the given {@link SubscriberExceptionHandler}.
*
* @param exceptionHandler Handler for subscriber exceptions.
* @since 16.0
*/
public CustomEventBus(SubscriberExceptionHandler exceptionHandler) {
super(
"default",
MoreExecutors.directExecutor(),
Dispatcher.perThreadDispatchQueue(),
exceptionHandler);
}
@Override
void handleSubscriberException(Throwable e, SubscriberExceptionContext context) {
throw new EventHandleException(e);
}
}
Czy możesz naprawić ten link? –
Poprawiono linkowanie, wypróbuj teraz. –