儘量不要驚慌
在 Rust 中,有兩種主要方法可以指示某個程式出錯:一個函式返回一個( 可能是自定義的 )Err(E)
,來自 Result<T, E>
型別和 panic!
。
恐慌不是異常的替代方案,常見於其他語言。在 Rust 中,恐慌是指出某些事情已經嚴重錯誤並且無法繼續。以下是 push
的 Vec
原始碼示例:
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.cap() {
self.buf.double();
}
...
}
如果我們記憶體不足,那麼 Rust 可以做的事情就不多了,所以它會出現恐慌(預設行為)或中止(需要使用編譯標誌設定)。
恐慌將展開堆疊,執行解構函式並確保清理記憶體。Abort 不會這樣做,並依賴作業系統來正確清理它。
嘗試正常執行以下程式,並使用
[profile.dev]
panic = "abort"
在你的 Cargo.toml
。
// main.rs
struct Foo(i32);
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping {:?}!", self.0);
}
}
fn main() {
let foo = Foo(1);
panic!("Aaaaaaahhhhh!");
}