From 13b089d6e475e7d2186e2aef9786095f747f4fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org> Date: Tue, 11 Mar 2025 16:28:18 +0100 Subject: [PATCH] Deal with errors inside Computed --- lazy_player/reactive.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lazy_player/reactive.py b/lazy_player/reactive.py index aa3c5e9..cf9e54b 100644 --- a/lazy_player/reactive.py +++ b/lazy_player/reactive.py @@ -1,5 +1,7 @@ from __future__ import annotations +import sys +import traceback from contextvars import ContextVar from typing import Any, Callable, ClassVar, Generic, Self, TypeVar from weakref import WeakSet @@ -10,10 +12,12 @@ T = TypeVar("T") class Ref(Generic[T]): + _error: Exception | None _users: WeakSet[Computed[Any]] _value: T def __init__(self, initial: T): + self._error = None self._value = initial self._users = WeakSet() @@ -24,6 +28,9 @@ class Ref(Generic[T]): if computed is not None: self._users.add(computed) + if self._error is not None: + raise self._error + return self._value @value.setter @@ -47,6 +54,7 @@ class Computed(Ref[T]): _update: Callable[[], T] def __init__(self, update: Callable[[], T]): + self._error = None self._update = update self._users = WeakSet() self.update() @@ -56,6 +64,10 @@ class Computed(Ref[T]): try: self.value = self._update() + self._error = None + except Exception as err: + self._error = err + traceback.print_exception(err, file=sys.stderr) finally: self._stack.reset(token)