Error handling 如何在我自己的代码中构造解析器?

Error handling 如何在我自己的代码中构造解析器?,error-handling,rust,code-reuse,Error Handling,Rust,Code Reuse,我想在我的函数中重用标准库。但是,我自己正在实现输入字符串的解析,因此不需要返回标准库返回的错误值 我没有找到构造parseinteror值的方法。我找到的唯一解决方案如下所示: use std::num::ParseIntError; fn from_str_radix(s: &str, radix: u32) -> Result<(), ParseIntError> { let error_empty = "".parse::<i32>().e

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

我没有找到构造
parseinteror
值的方法。我找到的唯一解决方案如下所示:

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(())
}
使用std::num::parseinteror;
fn from_str_基数(s:&str,基数:u32)->结果{
let error_empty=”“.parse::().expect_err(“get empty input error”);
让error_invalid_digit=“Z”。解析::()。期望_err(“get invalid digit error”);
如果s.为空(){
返回Err(error\u empty);
}
对于s.chars()中的c.rev(){
将c.与_数字(基数)匹配{
无=>返回错误(错误\u无效\u数字),
_=>未实施!(),
}
}
好(())
}

有没有更优雅的方法可以从我自己的代码中返回
parseinteror

目前还没有方法自己构建一个。正如你所发现的,有一个公开的要求将其公开。然而,我认为这不是一件好事

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


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

如果您想要自己的解析,为什么不想要自己的错误类型
ParseInteror
不执行公共构造函数,其字段是私有的。所以你看不见。但在我看来,如果使用std解析,则重用这个错误值是一种惯例。我不明白为什么我要切换到我自己的类型,仅仅因为我将我的内部实现从调用库函数更改为自己的解析。没有,我无法回答,你声称“我自己正在实现输入字符串的解析”,你从来没有在你的问题中说“我将我的内部实现从调用库函数更改为自己的解析”,因此,请将您的问题包括在内,并更准确地说明您想要什么和您做什么您可能会引发相同的错误,然后返回该错误,例如,
“a”。parse:()?
(不要太认真)我认为这不是一件好事,也许您可以使用夜间功能。仍在等待我的测试,使其可构造用于测试目的难道没有价值吗?@WilliamHammond可以
kind()
并与
IntErrorKind
匹配,如果您确实需要的话。或者只是
是_err()
。从2021年5月起,Interorkind和ParseInteror似乎都被标记为public@dagilpe不,情况没有改变,仍然没有办法创建一个解析器或您自己。