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

问题描述 投票:0回答:1

我想在我的函数中重用标准库的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

error-handling rust code-reuse
1个回答
3
投票

目前没有办法自己构建一个ParseIntError。正如你所发现的那样,有一个开放的issue要求公开。但是,我认为这不是一件好事。

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

所以,我认为你应该有自己的错误类型,也许使用相同的设计,有一个enum#[non_exhaustive]属性。有很多crates使错误更容易创建。您应该毫不犹豫地在自己的代码中使用自己的错误。

© www.soinside.com 2019 - 2024. All rights reserved.