Transparently propagate event handler errors

When an exception occurs during the execution of an event handler, it is
caught, wrapped inside an exception event and dispatched on the event
bus.

This applies to any throwable, but is not very useful for errors, as
these are not normally caught. Assertion errors in particular, which are
used in unit tests, should not be caught, as this would cause the test
runner to miss a failed test.

Therefore, errors are now transparently passed through to the caller of
the dispatch method.
This commit is contained in:
Kai S. K. Engelbart 2021-03-15 08:29:15 +01:00
parent d9ddc0e1a9
commit 122106bf39
Signed by: kske
GPG Key ID: 8BEB13EC5DF7EF13

View File

@ -67,7 +67,7 @@ public final class EventBus {
* @throws EventBusException if an event handler isn't accessible or has an invalid signature * @throws EventBusException if an event handler isn't accessible or has an invalid signature
* @since 0.0.1 * @since 0.0.1
*/ */
public void dispatch(Object event) { public void dispatch(Object event) throws EventBusException {
Objects.requireNonNull(event); Objects.requireNonNull(event);
logger.log(Level.INFO, "Dispatching event {0}", event); logger.log(Level.INFO, "Dispatching event {0}", event);
@ -90,6 +90,10 @@ public final class EventBus {
// Warn about system event not being handled // Warn about system event not being handled
logger.log(Level.WARNING, event + " not handled due to exception", e); logger.log(Level.WARNING, event + " not handled due to exception", e);
else if (e.getCause() instanceof Error)
// Transparently pass error to the caller
throw (Error) e.getCause();
else else
// Dispatch exception event // Dispatch exception event