Skip to content

Commit f2bf589

Browse files
committed
add try/except around event handling
1 parent 2b7f485 commit f2bf589

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/idom/core/layout.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ async def dispatch(self, event: LayoutEvent) -> None:
105105
handler = self._event_handlers.get(event.target)
106106

107107
if handler is not None:
108-
await handler(event.data)
108+
try:
109+
await handler(event.data)
110+
except Exception:
111+
logger.exception(f"Failed to execute event handler {handler}")
109112
else:
110113
logger.info(
111114
f"Ignored event - handler {event.target!r} does not exist or its component unmounted"

tests/test_core/test_layout.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ def use_toggle(init=False):
288288
return state, lambda: set_state(lambda old: not old)
289289

290290

291-
async def test_model_key_preserves_callback_identity_for_common_elements():
291+
async def test_model_key_preserves_callback_identity_for_common_elements(caplog):
292292
called_good_trigger = idom.Ref(False)
293293
good_handler = StaticEventHandler()
294294
bad_handler = StaticEventHandler()
@@ -330,6 +330,8 @@ def bad_trigger():
330330

331331
await layout.render()
332332

333+
assert not caplog.records
334+
333335

334336
async def test_model_key_preserves_callback_identity_for_components():
335337
called_good_trigger = idom.Ref(False)
@@ -495,3 +497,24 @@ def SomeComponent():
495497
next(iter(caplog.records)).message
496498
== f"Did not render component - {component_not_in_layout} already unmounted or does not belong to this layout"
497499
)
500+
501+
502+
async def test_log_error_on_bad_event_handler(caplog):
503+
bad_handler = StaticEventHandler()
504+
505+
@idom.component
506+
def ComponentWithBadEventHandler():
507+
@bad_handler.use
508+
def raise_error():
509+
raise Exception("bad event handler")
510+
511+
return idom.html.button({"onClick": raise_error})
512+
513+
with idom.Layout(ComponentWithBadEventHandler()) as layout:
514+
await layout.render()
515+
event = LayoutEvent(bad_handler.target, [])
516+
await layout.dispatch(event)
517+
518+
assert next(iter(caplog.records)).message.startswith(
519+
"Failed to execute event handler"
520+
)

0 commit comments

Comments
 (0)