通过例子学习Rust--18.错误处理
Rust-系列:
错误处理
panic
- 如果符合直接panic字符串并且退出。
Option和unwrap
- option是一种可能遇到不存在的情况,它可能会遇到
Some(T)
和None
两种情况。 - option可以和
match
进行组合,或者是使用unwrap
进行隐式处理(返回Some(T)或者panic)
使用?解开Option
- 首先使用Option嵌套struct,然后使用
?
进行嵌套。
组合算子:map
- 遇到只有一种输入有效的情况之下,使用组合算子 来以模块化的风格管理控制流。
- Option有一个内置方法
map
,用于Some-Some
和None->None
。多个map()调用串联,更加灵活。
rust
1 |
|
组合算子:and_then
- 由于使用map可能会出现多层
Option
导致混乱,所以有替代方法and_then()。
rust
1 |
|
结果Result
Result
相当于Option
的进化版本,可以有可能的错误 而不仅仅是不存在 。- 他有两个结果:
rust
1 | Ok<T>:找到T元素 |
Result
也有类似Option的方法,如unwrap(),也有类似的组合算子。Result
有parse()
方法,可以将字符串转换为想要的类型,但不一定总是成功,也可能失败。parse()
方法通常和unwrap()连接,以来达到处理错误的过程。parse()
使用FromStr
trait实现。
Result 的 map
- 使用间接地方法可以知道Result输入错误时知道parse
或者其他类型的返回详情。
rust
1 | use std::num::ParseIntError; |
给Result起别名
rust
1 | // 为带有错误类型 `ParseIntError` 的 `Result` 定义一个泛型别名。 |
提前返回
- 使用match控制流和提前返回也可以改善处理错误的方法。
- 具体的方法是使用result返回Err即可。
引入?
- 遇到只想返回Err而不想返回panic的情况之下,使用
?
效果较好。
try! 宏
- 旧的Rust代码中使用try!语句,它的作用和
?
相同。
处理多种错误类型
- 当多种不同的错误类型需要进行交互时,如Option和Result,不同的Result之间进行交互。
从Option中取出Result
- 让Option和Result相互包含,如Option中嵌套Result:
rust
1 | Option<Result<i32,ParseIntError>> |
- 或者使用组合算子进行交换
Result
和Option
,这通常出现在?
输出错误的时候继续处理。 - 组合算子可以在Rust标准库中学习使用。
自定义错误类型
- 实现Error trait和Display。
rust
1 | use std::error; |
把错误装箱
- 这种方法可以分辨错误类型,但是只有在函数运行过程了解,而不能静态判别。
- 标准库通过from实现了Box到Box
的转换。
rust
1 | use std::error; |
?的其他用法
- ?不仅仅是
unwrap
和return Err(err)
,实际上是unwrap
或者return Err(From::from(err))
,也就是说如果错误可以转换成返回类型地方使用?
,会自动转换成返回类型。
rust
1 | use std::error; |
包裹错误
- 将错误装箱改成包裹到自己的错误类型之中。
- 首先定义一个enum枚举中有两个结构体。
- 然后采用内部各变量对
Error trait
的实现不同的方法再进行输出错误信息。
遍历Result
- 使用filter_map()忽略失败的项
- 使用collect()使整个操作失败
- 使用Partiton()收集所有合法的值和错误