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 允许在 Web 浏览器中调试 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"

为此,配置了一个 崩溃钩子,该钩子通过 JavaScript console.error 函数将崩溃记录到开发者控制台。

但请注意,console_error_panic_hook 并非完全自动,因此您需要确保在任何代码运行之前调用 utils::set_panic_hook()(并且可以多次安全地运行 set_panic_hook)。

有关更多详细信息,请参阅 console_error_panic_hook 存储库