【Rust】错误处理
Rust
的错误处理方法非常不同寻常,本节介绍了 Rust 中两种不同类型的错误处理:panic
和 Result
。
Panic
当程序遇到,数组越界,除0
,这样很严重的bug
时就会panic
,在 Result
上调用 .expect()
遇到错误以及断言失败都会发生panic
。还有宏 panic!()
,用于在代码发现它出错是,想要直接退出。panic!()
接受可选的 println!()
样式参数,用于构建错误消息。
这些都是程序员的错,但我们都会犯错,当这些不该发生的错误发生时,Rust
可以终止进程。来看一个除0
的示例:
1 | fn main() { |
运行这段代码,程序会奔溃的并且打印出调用栈,还提示我们可以设置 RUST_BACKTRACE=full
获得更多的信息:
/Users/fudenglong/.cargo/bin/cargo run --color=always --package mandelbrot --bin mandelbrot
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/mandelbrot`
thread 'main' panicked at 'attempt to divide by zero', src/main.rs:7:5
stack backtrace:
0: rust_begin_unwind
at /rustc/4ca19e09d302a4cbde14f9cb1bc109179dc824cd/library/std/src/panicking.rs:584:5
1: core::panicking::panic_fmt
at /rustc/4ca19e09d302a4cbde14f9cb1bc109179dc824cd/library/core/src/panicking.rs:142:14
2: core::panicking::panic
at /rustc/4ca19e09d302a4cbde14f9cb1bc109179dc824cd/library/core/src/panicking.rs:48:5
3: mandelbrot::pirate_share
at ./src/main.rs:7:5
4: mandelbrot::main
at ./src/main.rs:2:5
5: core::ops::function::FnOnce::call_once
at /rustc/4ca19e09d302a4cbde14f9cb1bc109179dc824cd/library/core/src/ops/function.rs:248:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Process finished with exit code 101
线程之间的 panic
是相互独立的,也可以调用 std::panic::catch_unwind()
捕获异常,并且让程序执行。默认发生 panic
时会展开调用栈,此外有两种情况 Rust
不会尝试展开调用栈:
如果
.drop()
方法触发了第二次恐慌,而Rust
在第一次之后仍在尝试清理,这被认为是致命的,Rust
停止展开并中止整个进程;Rust
的恐慌行为是可定制的。如果使用-C panic=abort
编译,程序中的第一个panic
会立即中止进程。(使用这个选项,Rust
不需要知道如何展开调用栈,因此这可以减少编译代码的大小。)