Panics
Rust 通过 “panic”机制处理严重错误。
如果运行时发生严重错误,Rust 会触发 panic:
fn main() { let v = vec![10, 20, 30]; println!("v[100]: {}", v[100]); }
- Panic 用于指示不可恢复的意外错误。
- Panic反映了程序中的 bug 问题。
- 运行时失败(例如边界检查失败)可能会触发 panic
- 断言(例如
assert!
)在失败时会触发 panic - 针对特定用途的 panic 可以使用
panic!
宏。
- 使用 panic 会 “展开”堆栈,并丢弃对应的值,就像函数已经返回一样。
- 如果崩溃不可接受,请使用不会触发 panic 的 API(例如
Vec::get
)。
This slide should take about 3 minutes.
默认情况下,panic 会导致堆栈展开。您可以捕获展开信息:
use std::panic; fn main() { let result = panic::catch_unwind(|| "No problem here!"); println!("{result:?}"); let result = panic::catch_unwind(|| { panic!("oh no!"); }); println!("{result:?}"); }
- 捕获异常;请勿尝试使用
catch_unwind
实现异常! - 如果服务器需要持续运行(即使是在请求发生崩溃的情况下), 此方法十分有用。
- 如果您在
Cargo.toml
中设置了panic = 'abort'
,此方法不会生效。