Rust中的错误分成两种, 不可修复(unrecoverable)和可修复(recoverable)不可修复错误, 如访问超出数组范围的元素, 是需要被禁止的.
可修复错误, 如文件不存在的一类错, 可以将问题提交给用户, 然后尝试重新操作来解决.
不可修复错误rust中通过调用宏panic!实现, 可修复错误对应数据类型Result. 需要注意的是, 不同于其它编程语言, rust没有抛出异常(exception)的机制.
不可修复错误: panic!
当程序调用panic!, 默认回滚程序对应的栈(stack), 清空被各个函数调用的数据. 同时也可以在文件Cargo.toml修改[profile]的设置, 强制终止程序, 让后把清空相应内存的任务, 扔给系统.
[profile.release]
panic = 'abort'
我在写rust的时候可以直接调用Panic!, 列如
fn main(){panic!("crash and burn");}
执行结果如下:
$ cargo run
Compiling panic v0.1.0 (file:///projects/panic)
Finished dev [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/panic`
thread 'main' panicked at 'crash and burn', src/main.rs:2:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
也有可能是我们使用的类库中调用了panic!, 例如
fn main(){letv=vec![1,2,3];v[99];}
执行结果如下:
$ cargo run
Compiling panic v0.1.0 (file:///projects/panic)
Finished dev [unoptimized + debuginfo] target(s) in 0.27s
Running `target/debug/panic`
thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 99', libcore/slice/mod.rs:2448:10
note: Run with `RUST_BACKTRACE=1` for a backtrace.
我们可以看到, 是libcore/slice/mod.rs第2448行调用了panic!. 此时, 我们还可以