前言#
昨天我们学习了hash map,第八章就学完了
今天该往下学第九章了
错误处理#
总所周知,bug是编程的一部分,同样适用于error。它们都是编程不可或缺的一部分。
rust提供了很多错误相关的特性以应对可能存在的错误场景。同时rust要求开发者们要去了解这些错误特性,因为有些错误是无法在编译的时候发现的,所以会尽可能强制开发者自己去做保护。
rust中的错误可分为两类:
- 可恢复的(
recoverable) - 不可恢复的(
unrecoverable)
这很好理解,一种是直接程序崩溃,比如数据结构错了,或者数组越界,这种时候还是直接崩溃最好。
另一种是可以绕过错误场景继续往下运行,比如读取某个文件发现这个文件不存在,这个时候给个错误提示或者给它创建一个就好。
别的语言基本上都是采用错误机制,捕获到错误并抛出,但rust中就没这东西。rust给可恢复的错误类型提供了一个Result的错误泛型,而不可恢复的可以用panic!这个macro
不可恢复(unrecoverable)错误和panic!#
上面也说了,rust中有些场景是会直接panic的,比如数组越界。然而你也可以用panic!这个macro手动去触发这个场景。
在学习panic!之前,我们要先了解一个rust中的知识。在发生panic(恐慌)的时候默认是会清空调用栈并且展示给开发者的(沿着调用栈往回走,一边走一边清空数据),但是这样做需要耗费的时间很多和做很多的事情。所以rust提供了另一种选择,允许程序发生panic的时候不去清空调用栈,而是交由操作系统去清空,这样就可以省下很多工作。
我们可以在Cargo.toml中给profile.release部分添加panic = 'abort'来终止调用栈展开,我们来试下
fn main () {
panic!("something wrong");
} 
而正常情况下会是

不过你应该注意到了一句提示run with RUST_BACKTRACE=1,我们来试下。(基于window系统)
powershell
$Env:RUST_BACKTRACE=1
cargo run而cmd则是
set RUST_BACKTRACE=1
cargo run 如果是类unix系统
RUST_BACKTRACE=1 cargo run 
可以看到调用栈情况了,虽然看的不是很懂。
不过这种错误栈提示只有在debug场景下才会有效,也就是build不带--release或者直接cargo run。
这里还有一个提示run with RUST_BACKTRACE=null,就不展示了。
意思是默认会隐藏掉一些第三方库等的错误信息,设置为null就都会展示。
总结#
今天的内容有些水。。。。
参考#
- ^rust-error-handling https://doc.rust-lang.org/book/ch09-00-error-handling.html#error-handling
编辑于 2022-12-12 22:14・IP 属地广东
