src/utils.rs
utils.rs
的目的是定义 utils
模块,该模块包含一个名为 set_panic_hook
的函数。此函数成为 lib.rs
中 utils
模块的一部分,如上一节所述。
如果未启用 console_error_panic_hook
功能,则 set_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
存储库。