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

Mic*_*yin 6 error-handling code-reuse rust

我想在我的函数中重用标准库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(())
}
Run Code Online (Sandbox Code Playgroud)

ParseIntError有没有更优雅的方式从我自己的代码返回?

Sta*_*eur 5

目前还没有办法自己构建ParseIntError。当您找到它时,有一个issue要求将其公开的开放。但是,我认为这不是一个好主意。

ParseIntError是模块的错误num。它并不适合每个实现解析箱的人使用,因为您应该有自己的潜在错误。您可以使用IntErrorKind,但我仍然认为这不是一件好事,因为您最终可能不会出现相同的错误。

所以,我认为你应该有自己的错误类型,并且可能使用相同的设计,有一个enumwith#[non_exhaustive]属性。您应该毫不犹豫地在自己的代码中使用自己的错误。请参阅非常好的文章Rust 中的错误处理 - 深入探讨。(我个人并不同意文章中的所有内容,但仍然是高质量的,我建议使用snafuthiserror

  • 使其可用于测试目的是否有价值? (4认同)