Rust Result:解析时长并区分格式与范围错误
用 Result 编写分钟数解析函数,借助问号传播错误,再用 match 显式处理每条输入的成功与失败。
本节目标
用 Result 编写分钟数解析函数,借助问号传播错误,再用 match 显式处理每条输入的成功与失败。
环境与运行方法
保存为 lesson.rs,使用 Rust 工具链执行 rustc --edition=2021 lesson.rs -o lesson,然后运行 ./lesson。代码也可放进 Cargo 项目的 src/main.rs。
核心思路
格式错误和超过业务上限属于不同失败原因。Result 将这种分支写在类型里。本例以固定字符串表示错误;更大的应用可以使用专门枚举,避免到处比较字符串。
完整示例
fn minutes(text: &str) -> Result<u32, &'static str> {
let value = text.parse::<u32>().map_err(|_| "format")?;
if value > 1440 { return Err("range"); }
Ok(value)
}
fn main() {
for input in ["45", "x", "1441", "0"] {
match minutes(input) {
Ok(value) => println!("ok={}", value),
Err(reason) => println!("error={}", reason),
}
}
}预期输出
ok=45
error=format
error=range
ok=0逐步理解
parse 尝试转换为 u32,map_err 转换错误表达,问号在失败时提前返回。成功解析后仍需限制 1440,因为类型允许的范围远大于一天的分钟数。
match 覆盖两个分支,坏输入不会触发 unwrap 引起的 panic。本例不自动 trim,首尾空白不被接受;是否清洗空白应由输入契约决定。返回零不是错误的合适替代,因为零本身合法。
常见问题与边界
- unwrap 不适合作为用户输入错误的默认处理。
- 无符号类型拒绝负数,但不能代替业务上限检查。
- 统一吞掉错误会失去逐条报告原因的能力。
动手练习
增加 "1440"、"-1" 和空字符串。
参考答案
1440 合法;负数与空字符串都无法解析成 u32,得到 format。如果需要把负数分成独立业务错误,应改为先解析有符号类型。
文章回复
0 条公开回复