src/utils.rs

utils.rs 的目的是定義 utils 模組,其中包含一個函式 set_panic_hook。如前一節所述,此函式將成為 lib.rsutils 模組的一部分。

如果未啟用 console_error_panic_hook 功能,則 set_panic_hook 將被定義為一個內嵌的空函式。因此,使用它不會造成執行時間效能或程式碼大小的負擔。

我們將討論

  1. 定義 set_panic_hook
  2. 什麼是 console_error_panic_hook

1. 定義 set_panic_hook


# #![allow(unused_variables)]
#fn main() {
pub fn set_panic_hook() {
    // When the `console_error_panic_hook` feature is enabled, we can call the
    // `set_panic_hook` function at least once during initialization, and then
    // we will get better error messages if our code ever panics.
    //
    // For more details see
    // https://github.com/rustwasm/console_error_panic_hook#readme
    #[cfg(feature = "console_error_panic_hook")]
    console_error_panic_hook::set_once();
}
#}

在這裡,我們定義了一個以 cfg 屬性開頭的函式。這個屬性 #[cfg(feature = "console_error_panic_hook")] 告訴 Rust 在編譯時檢查 console_error_panic_hook 功能是否已設定。如果已設定,它將呼叫此函式。如果未設定,則不會!

2. 什麼是 console_error_panic_hook

crate console_error_panic_hook 允許在網頁瀏覽器中除錯 Rust 恐慌訊息,使其更容易除錯 WebAssembly 程式碼。

讓我們比較一下在啟用此功能前後,Rust 程式碼發生恐慌時的情況

之前: "RuntimeError: Unreachable executed"

之後: "panicked at 'index out of bounds: the len is 3 but the index is 4', libcore/slice/mod.rs:2046:10"

為此,會設定一個 恐慌鉤子 (panic hook),透過 JavaScript 的 console.error 函式將恐慌訊息記錄到開發者主控台。

但請注意,console_error_panic_hook 並非完全自動化的,因此您需要確保在任何程式碼執行之前呼叫 utils::set_panic_hook()(而且可以多次安全地執行 set_panic_hook)。

如需更多詳細資訊,請參閱 console_error_panic_hook 儲存庫