You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
}

说明

  1. 原代码的panic!会直接终止程序,而我们需要让函数返回Err(err),这样才符合Result类型的设计,也能满足测试用unwrap_err()获取错误的需求。
  2. map方法是Result类型的常用工具:它会对Ok包裹的值执行闭包里的计算,保持Err分支原样返回,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Tomasz Waszczyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:45:35