错误枚举

你可能感觉上一练习的解答有些笨拙:基于字符串进行匹配并不理想!如果同事修改了Ticket::new返回的错误信息(例如为了提高可读性),突然之间,你的调用代码就会出错。

你已经知道了修复这个问题所需的方法:枚举!

针对错误做出反应

当你希望允许调用者根据发生的特定错误采取不同行为时,你可以使用枚举来表示不同的错误情况:

#![allow(unused)]
fn main() {
// 一个错误枚举,代表从字符串解析`u32`时可能发生的
// 不同错误情况。
enum U32ParseError {
    NotANumber,
    TooLarge,
    Negative,
}
}

使用错误枚举,你将不同的错误情况编码进了类型系统中——它们成为了可失败函数签名的一部分。这简化了调用者的错误处理,因为他们可以使用match表达式针对不同的错误情况进行反应:

#![allow(unused)]
fn main() {
match s.parse_u32() {
    Ok(n) => n,
    Err(U32ParseError::Negative) => 0,
    Err(U32ParseError::TooLarge) => u32::MAX,
    Err(U32ParseError::NotANumber) => {
        panic!("Not a number: {}", s);
    }
}
}

参考资料

  • 本节练习位于 exercises/05_ticket_v2/08_error_enums