diff --git a/reflex/state.py b/reflex/state.py index d864391988f..05b4d1cccea 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -42,6 +42,7 @@ from reflex.event import ( BACKGROUND_TASK_MARKER, Event, + EventActionsMixin, EventHandler, EventSpec, fix_events, @@ -2359,7 +2360,7 @@ class FrontendEventExceptionState(State): """Substate for handling frontend exceptions.""" @event - def handle_frontend_exception(self, stack: str, component_stack: str) -> None: + def handle_frontend_exception(self, stack: str, component_stack: str): """Handle frontend exceptions. If a frontend exception handler is provided, it will be called. @@ -2369,11 +2370,31 @@ def handle_frontend_exception(self, stack: str, component_stack: str) -> None: stack: The stack trace of the exception. component_stack: The stack trace of the component where the exception occurred. + Returns: + Chained event specs to be executed. + + Raises: + TypeError: If the frontend exception handler is not callable. """ - prerequisites.get_and_validate_app().app.frontend_exception_handler( - Exception(stack) + frontend_exception_handler = ( + prerequisites.get_and_validate_app().app.frontend_exception_handler ) + if isinstance(frontend_exception_handler, EventActionsMixin) and callable( + frontend_exception_handler + ): + return frontend_exception_handler(stack) + if not callable(frontend_exception_handler): + raise TypeError( + f"Frontend exception handler must be callable. Got {type(frontend_exception_handler)}." + ) + value = frontend_exception_handler(Exception(stack)) + if value is not None: + console.warn( + f"Frontend exception handler returned a value: {value}. This is not supported with plain functions." + " Consider using an Event in a state class instead." + ) + class UpdateVarsInternalState(State): """Substate for handling internal state var updates."""