捕获Rust中的错误(Rust URL)

时间:2014-10-24 00:38:43

标签: url error-handling rust

请注意我正在使用每晚生成的Rust 0.13.0

首先,我是Rust的初学者,我仍在尽可能多地使用该语言。在我的消费中,我能够找到的一个主题是错误处理。所以,当我第一次尝试在我的代码中使用外部库时,我很快就被我应该如何使用返回给我的材料。

为了帮助解释我的困惑,我将引用rust-url库。以下是documentation中的一些示例代码:

use url::{Url, InvalidIpv6Address};

assert!(Url::parse("http://[:::1]") == Err(InvalidIpv6Address))

这对我来说非常简单。但是,我的下一个问题是:其他错误呢?我进一步研究了ParseError枚举,发现了15个其他类型的错误,这些错误可能是由格式错误的URL产生的。

所以,我的问题是,什么被认为是处理所有这些不同条件的正确方法?我应该有一个冗长的匹配,提醒每个人的专门消息吗?有没有办法一次性消费它们?

如果对这个问题没有一个答案我很抱歉,但谷歌没有说清楚,在我以错误的方式对项目的其余部分进行编码之前,我宁愿对此有所反馈。

2 个答案:

答案 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