尽量不要惊慌
在 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!");
}