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