请注意我正在使用每晚生成的Rust 0.13.0
首先,我是Rust的初学者,我仍在尽可能多地使用该语言。在我的消费中,我能够找到的一个主题是错误处理。所以,当我第一次尝试在我的代码中使用外部库时,我很快就被我应该如何使用返回给我的材料。
为了帮助解释我的困惑,我将引用rust-url库。以下是documentation中的一些示例代码:
use url::{Url, InvalidIpv6Address};
assert!(Url::parse("http://[:::1]") == Err(InvalidIpv6Address))
这对我来说非常简单。但是,我的下一个问题是:其他错误呢?我进一步研究了ParseError
枚举,发现了15个其他类型的错误,这些错误可能是由格式错误的URL产生的。
所以,我的问题是,什么被认为是处理所有这些不同条件的正确方法?我应该有一个冗长的匹配,提醒每个人的专门消息吗?有没有办法一次性消费它们?
如果对这个问题没有一个答案我很抱歉,但谷歌没有说清楚,在我以错误的方式对项目的其余部分进行编码之前,我宁愿对此有所反馈。
答案 0 :(得分:3)
ParseError
枚举用a custom useful message for each variant实现Show
特征,所以当你到达实际处理解析错误的最后一步时(例如在操纵Result
之后)无论你认为合适的方式,你都可以将错误的可能性视为一个黑盒子:
fn download(s: &str) {
match Url::parse(s) {
Ok(url) => { ... }
Err(e) => {
println!("Could not parse '{}'. {}.", s, e);
}
}
}
会打印Could not parse 'http://[:::1]'. Invalid IPv6 address.
等内容。
(我提交了#43关于使Show
消息更低级,以便它在更复杂的错误消息中更好地流动。)
答案 1 :(得分:2)
Url::parse
返回ParseResult<Url>
,其定义为Result<Url, ParseError>
,因此您可以使用通用的Result
方法:
use url::{Url, InvalidIpv6Address};
assert!(Url::parse("http://[:::1]").is_err());
Result
是Rust首选的错误处理方法,并且有many convenience methods。例如,如果您不期望失败,可以使用.unwrap()
使任何失败致命。当他们不能满足您的需求时,您也可以match
对抗Result
。