Panics

Rust 通过 “panic”机制处理严重错误。

如果运行时发生严重错误,Rust 会触发 panic:

  1. fn main() {
  2. let v = vec![10, 20, 30];
  3. println!("v[100]: {}", v[100]);
  4. }
  • Panic 用于指示不可恢复的意外错误。
    • Panic反映了程序中的 bug 问题。
    • 运行时失败(例如边界检查失败)可能会触发 panic
    • 断言(例如 assert!)在失败时会触发 panic
    • 针对特定用途的 panic 可以使用 panic! 宏。
  • 使用 panic 会 “展开”堆栈,并丢弃对应的值,就像函数已经返回一样。
  • 如果崩溃不可接受,请使用不会触发 panic 的 API(例如 Vec::get)。

This slide should take about 3 minutes.

默认情况下,panic 会导致堆栈展开。您可以捕获展开信息:

  1. use std::panic;
  2. fn main() {
  3. let result = panic::catch_unwind(|| "No problem here!");
  4. println!("{result:?}");
  5. let result = panic::catch_unwind(|| {
  6. panic!("oh no!");
  7. });
  8. println!("{result:?}");
  9. }
  • 捕获异常;请勿尝试使用 catch_unwind 实现异常!
  • 如果服务器需要持续运行(即使是在请求发生崩溃的情况下), 此方法十分有用。
  • 如果您在 Cargo.toml 中设置了 panic = 'abort',此方法不会生效。