Uso el EventBus de guava, desafortunadamente atrapa y registra la InvocationTargetException que ocurre cuando un controlador de eventos arroja una RuntimeException. ¿Puedo deshabilitar este comportamiento?Guava EventBus: no atrapa RuntimeException
Respuesta
Tal como está, esta es una decisión deliberada, y discutido en la documentación EventBus:
Los manipuladores no deben, en general, lanzar. Si lo hacen, EventBus detectará y registrará la excepción. Esta rara vez es la solución correcta para el manejo de errores y no se debe confiar en ella; está destinado únicamente a ayudar a encontrar problemas durante el desarrollo.
soluciones alternativas son being considered, aunque tengo serias dudas de que va a hacer en la liberación 12.
Aquí es código para perezosos
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);
}
}
}
Ahora, puede suscribirse ExceptionEvent
.
Aquí es mi ExceptionEvent
para copiar sólo & pasta
@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;
}
}
Sólo heredar EventBus guayaba, y escribir es el propietario EventBus personalizado. Sugerencias: esta clase debe escribir en el paquete com.google.common.eventbus, de modo que se pueda sobrescribir el método interno.
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);
}
}
- 1. Servicio de mensajería que funciona como el EventBus de Guava
- 2. Anotaciones vs interfaz de guayaba EventBus
- 3. try catch no atrapa la excepción?
- 4. Cómo usar GWT EventBus
- 5. Uso adecuado de RuntimeException?
- 6. Servicio reiniciable utilizando Guava
- 7. ¿Qué GWT EventBus debería usar?
- 8. Un marco EventBus para Android
- 9. ¿Por qué no se atrapa a SIGINT aquí?
- 10. mejor manera de combinar EventBus guayaba y AWT manejo
- 11. Guava Bloom Filter no admite inserciones grandes?
- 12. Ejemplo de Akka EventBus para Java
- 13. guayaba java EventBus error de instancias
- 14. Usando Guava con GWT
- 15. Guava: ¿Dónde está CharEscaper?
- 16. Filtrado Guava Multimaps
- 17. Guava: Throwables.propagate e InterruptedException
- 18. Guava MultiMap y ConcurrentModificationException
- 19. Recursos para la Guava
- 20. RuntimeException en Camera.setParameters() en nexus one
- 21. Cuándo está bien atrapar una RuntimeException
- 22. Encuadernación en objeto nulo: RuntimeException: java.lang.reflect.InvocationTargetException
- 23. Guava concurrency tutorials/code
- 24. si especificas @Transactional rollbackFor también incluyen RuntimeException
- 25. Guava r07, GWT y javax.annotation.Nullable
- 26. inicializando una ImmutableMap de Guava
- 27. Problemas con GWT y Guava
- 28. Guava ImmutableList copyOf vs Builder
- 29. Google Guava Ejemplo de proveedor
- 30. ¿Cómo se usa SimpleEventBus o EventBus de GWT?
¿Puedes reparar ese enlace? –
Vinculado fijo, pruébalo ahora. –