如何在自己的代码中构造ParseIntError?

时间:2019-04-08 11:10:28

标签: error-handling rust code-reuse

我想在函数中重用标准库的ParseIntError。但是,我自己在实现输入字符串的解析,因此不需要返回标准库返回的错误值。

我没有找到构造ParseIntError值的方法。我发现的唯一解决方案是这样的:

use std::num::ParseIntError;

fn from_str_radix(s: &str, radix: u32) -> Result<(), ParseIntError> {
    let error_empty = "".parse::<i32>().expect_err("get empty input error");
    let error_invalid_digit = "Z".parse::<i32>().expect_err("get invalid digit error");

    if s.is_empty() {
        return Err(error_empty);
    }

    for c in s.chars().rev() {
        match c.to_digit(radix) {
            None => return Err(error_invalid_digit),
            _ => unimplemented!(),
        }
    }

    Ok(())
}

从我自己的代码中返回ParseIntError的方法是否更优雅?

1 个答案:

答案 0 :(得分:3)

当前无法自行构建ParseIntError。当您找到它时,有一个开放的issue要求将其公开。但是,我认为这不是好事。

ParseIntErrornum模块的错误。并不是每个实现解析箱的人都可以使用它,因为您应该有自己的潜在错误。您可以使用IntErrorKind,但我仍然认为这不是一件好事,因为您可能会因为没有相同的错误而结束。

因此,我认为您应该具有自己的错误类型,并且可能使用相同的设计,并具有带有enum属性的#[non_exhaustive]。有很多crates使错误更容易产生。您应该毫不犹豫地在自己的代码中使用自己的错误。