[yew-devel] [RFC PATCH] store: use try_borrow and expect_throw for better error messages

Shannon Sterz s.sterz at proxmox.com
Mon May 5 15:28:23 CEST 2025


this makes use of the `UnwrapThrowExt` trait to improve error messages
when acquring store locks. taking such locks in async functions can
sometimes lead to bugs that can be unreliably reproduced, this should
provide more information about the source of the error compared to
just panicking.

Signed-off-by: Shannon Sterz <s.sterz at proxmox.com>
---

alternatively we could return the error here directly (or wrap it) and
let the call site handle such errors. however, that would require
breaking this public api, so i decided against this for now.

 src/state/store.rs | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/state/store.rs b/src/state/store.rs
index bde7d9da..b071182c 100644
--- a/src/state/store.rs
+++ b/src/state/store.rs
@@ -10,6 +10,8 @@ use yew::html::IntoEventCallback;
 use yew::prelude::*;
 use yew::virtual_dom::Key;

+use wasm_bindgen::UnwrapThrowExt;
+
 use crate::props::{
     ExtractKeyFn, ExtractPrimaryKey, FilterFn, IntoFilterFn, IntoSorterFn, SorterFn,
 };
@@ -130,7 +132,10 @@ impl<T: 'static> Store<T> {
     /// Panics if the value is currently mutably locked.
     pub fn read(&self) -> StoreReadGuard<T> {
         StoreReadGuard {
-            state: self.inner.borrow(),
+            state: self
+                .inner
+                .try_borrow()
+                .expect_throw("Could not acquire read lock on store!"),
         }
     }

@@ -142,7 +147,11 @@ impl<T: 'static> Store<T> {
     /// When the returned [StoreWriteGuard] is dropped, the store listeners
     /// are notified. To prevent that use [StoreWriteGuard::skip_update]
     pub fn write(&self) -> StoreWriteGuard<T> {
-        let state = self.inner.borrow_mut();
+        let state = self
+            .inner
+            .try_borrow_mut()
+            .expect_throw("Could not acquire write lock on store!");
+
         StoreWriteGuard {
             state,
             update: true,
--
2.39.5





More information about the yew-devel mailing list