如何为自定义错误实现std :: convert :: From <std :: error :: Error>?

时间:2019-07-17 05:50:24

标签: error-handling rust

我已经在从CSV文件读取的模块中实现了自定义错误类。由于读取文件时可能会发生不同的错误,因此我为代码中可能发生的所有类型的错误实现了std::convert::From。但是,鉴于我自己不需要有关错误的任何信息,我希望我可以只实现From<Error>(或使用更简化的方法)。

这是实现自定义错误的代码:

#[derive(Debug)]
pub struct ParseError {
    kind: ParseErrorKind,
    message: String,
}
#[derive(Eq, PartialEq, Hash, Debug)]
pub enum ParseErrorKind {
    Untracked,
    TrackedError1,
    TrackedError2,
    TrackedErrorN,
}
impl std::convert::From<std::num::ParseIntError> for ParseError {
    fn from(error: std::num::ParseIntError) -> Self {
        ParseError {
            kind: ParseErrorKind::Untracked,
            message: error.to_string(),
        }
    }
}
impl std::convert::From<std::num::ParseFloatError> for ParseError {
    fn from(error: std::num::ParseFloatError) -> Self {
        ParseError {
            kind: ParseErrorKind::Untracked,
            message: error.to_string(),
        }
    }
}

它是在解析CSV记录的函数中生成的:

    fn from_record(rec: &HashMap<String, String>) -> Result<Info, ParseError> {
        Ok(Info {
            field: rec["column"].parse::<u32>()?,
        })
    }

然后我使用loader函数中的错误来计算跟踪的错误:

            // let error_counts: HashMap<ParseErrorKind, u64>;
            let info = match Info::from_record(&record) {
                Ok(i) => i,
                Err(e) => {
                    *error_counts.entry(e.kind).or_insert(0) += 1;
                    continue;
                }
            };

是否有实现std::convert::From<std::convert::Error>的方法,或者还有其他简化的方法吗?

0 个答案:

没有答案