错误枚举
你可能感觉上一练习的解答有些笨拙:基于字符串进行匹配并不理想!如果同事修改了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