From ea52e6fc8f9738d391bc1e97187326a9c0498e2e Mon Sep 17 00:00:00 2001 From: Lucas Gomide Date: Wed, 30 Apr 2025 11:20:27 -0300 Subject: [PATCH] fix: prevent crash when event handler raises exception Previously, if a registered event handler raised an exception during execution, it could crash the entire application or interrupt the event dispatch process. This change wraps handler execution in a try/except block within the `emit` method, ensuring that exceptions are caught and logged without affecting other handlers or flow. This improves the resilience of the event bus, especially when handling third-party or temporary listeners. --- src/crewai/utilities/events/crewai_event_bus.py | 7 ++++++- tests/utilities/events/test_crewai_event_bus.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/crewai/utilities/events/crewai_event_bus.py b/src/crewai/utilities/events/crewai_event_bus.py index 9cde461ca..f255e5513 100644 --- a/src/crewai/utilities/events/crewai_event_bus.py +++ b/src/crewai/utilities/events/crewai_event_bus.py @@ -70,7 +70,12 @@ class CrewAIEventsBus: for event_type, handlers in self._handlers.items(): if isinstance(event, event_type): for handler in handlers: - handler(source, event) + try: + handler(source, event) + except Exception as e: + print( + f"[EventBus Error] Handler '{handler.__name__}' failed for event '{event_type.__name__}': {e}" + ) self._signal.send(source, event=event) diff --git a/tests/utilities/events/test_crewai_event_bus.py b/tests/utilities/events/test_crewai_event_bus.py index 315fbe138..aec17a8a6 100644 --- a/tests/utilities/events/test_crewai_event_bus.py +++ b/tests/utilities/events/test_crewai_event_bus.py @@ -32,3 +32,16 @@ def test_wildcard_event_handler(): crewai_event_bus.emit("source_object", event) mock_handler.assert_called_once_with("source_object", event) + + +def test_event_bus_error_handling(capfd): + @crewai_event_bus.on(BaseEvent) + def broken_handler(source, event): + raise ValueError("Simulated handler failure") + + event = TestEvent(type="test_event") + crewai_event_bus.emit("source_object", event) + + out, err = capfd.readouterr() + assert "Simulated handler failure" in out + assert "Handler 'broken_handler' failed" in out