Rustlings errors2练习:ParseIntError错误处理问题
Rustlings errors2 练习错误处理问题
我在做Rustlings的errors2练习时遇到了错误处理的问题。我的代码如下:
pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { let processing_fee = 1; let cost_per_item = 5; let qty = item_quantity.parse::<i32>(); let quantity_result = match qty { Ok(qty) => (qty * cost_per_item + processing_fee), Err(err) => panic!("invalid digit found in string {:?}", err), }; Ok(quantity_result) }
函数的Ok分支能正常工作,但不知道怎么正确实现Err分支。对应的测试代码是:
#[test] fn item_quantity_is_an_invalid_number() { assert_eq!( total_cost("beep boop").unwrap_err().to_string(), "invalid digit found in string" ); }
现在运行测试会触发panic,报错信息:
panicked at 'invalid digit found in string ParseIntError { kind: InvalidDigit }'
问题根源
你的函数声明返回Result<i32, ParseIntError>,但Err分支直接调用panic!崩溃,违反了函数的返回约定——测试期望函数返回错误变体,而不是直接终止程序。
修正后的代码
基础匹配写法
use std::num::ParseIntError; pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { let processing_fee = 1; let cost_per_item = 5; let qty = item_quantity.parse::<i32>(); let quantity_result = match qty { Ok(qty) => Ok(qty * cost_per_item + processing_fee), Err(err) => Err(err), }; quantity_result }
简洁写法(利用Result的map方法)
use std::num::ParseIntError; pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { let processing_fee = 1; let cost_per_item = 5; item_quantity.parse::<i32>().map(|qty| qty * cost_per_item + processing_fee) }
说明
- 原代码的
panic!会直接终止程序,而我们需要让函数返回Err(err),这样才符合Result类型的设计,也能满足测试用unwrap_err()获取错误的需求。 map方法是Result类型的常用工具:它会对Ok包裹的值执行闭包里的计算,保持Err分支原样返回,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Tomasz Waszczyk
相关产品推荐
相关产品推荐

