尽量不要惊慌

在 Rust 中,有两种主要方法可以指示某个程序出错:一个函数返回一个( 可能是自定义的Err(E),来自 Result<T, E>类型和 panic!

恐慌不是异常的替代方案,常见于其他语言。在 Rust 中,恐慌是指出某些事情已经严重错误并且无法继续。以下是 pushVec 源代码示例:

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!");
}