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