错误处理
大约 1 分钟
错误的分类
- 可恢复
- 列如文件未找到,可再次尝试
- 应对机制:
Result<T, E>
- 不可恢复
- Bug,列如访问的索引超出范围
- 应对机制:
panic!
程序立即终止执行
panic! - 不可恢复的错误
- 当 panic!执行时
- 程序答应错误信息
- 展开,清理调用栈
- Rust 会展开调用栈(工作量大)
- Rust 沿着调用栈往回走
- 清理每个遇到的的函数的数据
- 立即终止调用栈
- 不进行清理,直接停止程序
- 内存需要操作系统清理
- 想让二进制文件更小可以把展开设置为终止
在 Cargo.toml 中设置[profile.release] panic = 'abort'
- Rust 会展开调用栈(工作量大)
- 退出程序
Result 枚举
enum Result<T, E> {
OK(T),
ERR(E),
}
example
use std::fs::File; fn main() { let f = File::open("hello.world"); let f = match f { Ok(file) => file, Err(error) => panic!("open file error {:#?}", error), }; println!("{:#?}", f) }
在该例中,
File::open("hello.world")
的返回值有Ok(T)
和Err(E)
,其中 T 是我们需要的文件对象
何时使用 panic!
- 演示 unwrap
- 原型代码 unwrap, expect
- 测试 ubwrap, expect
- 有时你确定 Result 的返回就是 Ok: 使用 unwrap
use std::net::IpAddr; fn main() { //你可以确定该字符可以被成功转化为ip地址,但是parse()会返回Result类型,所以编译器任然认为可能出现panic! let ip: IpAddr = "127.0.0.1".parse().unwrap(); }