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',此方法不会生效。