Rust 错误(Panic)处理规范
panic!与不可预期(不可恢复)错误
panic!时程序默认开始展开(unwinding)、回溯栈并清理函数据
如果希望二进制文件尽量小,可以选择“终止(abort)”,此时
程序内存由操作系统进行清理,在Cargo.toml中添加
[profile]
panic='abort'
[profile.release]
panic='abort'
前者是配置debug时,后者配置release版本
Result与潜在(可预期、可恢复)错误
Result枚举类型
Result<T, E>{
Ok<T>,
Err<E>,
}
T:成功时Ok成员中的数据类型E:失败时Err成员中返回的数据类型
直接处理
对
Result值进行模式匹配,分别处理let f = File::open(“hello.txt”); let mut f = match f { Ok(file) => file, Err(error) => panic!(“error:{:?}”, error), }
使用
Result上定义的方法(类似以上)Result.unwrap()T = Ok<T>.unwrap()Err<E>.unwrap()使用默认信息调用panic
Result.expect(&str)T = Ok<T>.expect(&str)Err<E>.expect(&str)使用&str调用!panic
Result.unwrap_or_elseResult.unwrap_or_else(|err|{
clojure...})
T = Ok<T>.unwrap_or_else()Err<E>.unwrap_or_else()将E作为闭包参数调用 闭包
Result.is_err()False = Ok<T>.is_err()True = Err<E>.is_err()
传播错误(Propagating)
对Result对象进行匹配,提前返回Err<E>,需要注意返回值
类型问题,尤其是在可能存在多处潜在错误需要返回
let f = File:open("hello.txt");
let mut f match f {
Ok(file) => file,
Err(error) => return Err(error),
}
?简略写法(效果同上)
let mut f = File::open("hello.txt")?
?会把Err(error)传递给from函数(定义在标准库Fromtrait中),将错误从转换为函数返回值中的类型,潜在 错误类型都实现了from函数?只能用于返回值为Result类型的函数内,因为其”返回值” 就是Err(E)(如果有)