恐慌

Rust 會透過「恐慌」來處理嚴重錯誤。

如果執行階段發生重大錯誤,Rust 就會觸發恐慌:

fn main() {
    let v = vec![10, 20, 30];
    println!("v[100]: {}", v[100]);
}
  • 恐慌代表發生無法復原的非預期錯誤。
    • 恐慌可以反映程式中的錯誤。
    • 執行階段失敗 (例如失敗的邊界檢查) 可能會觸發恐慌
    • 斷言 (例如 assert!) 會在失敗時發生恐慌
    • 針對特定用途的恐慌可以使用 panic! 巨集。
  • 恐慌會「解開」堆疊,此行為捨棄值的方式就像函式已傳回一樣。
  • 如果無法接受程式崩潰,請使用不會觸發恐慌的 API,例如 Vec::get
This slide should take about 3 minutes.

根據預設,恐慌會造成解開堆疊。您可以擷取這類動作:

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',就無法採取此做法。