我是否被迫创建自己的错误类型?

时间:2015-08-11 12:08:31

标签: error-handling rust

我想写一个get_members函数,它返回GitHub团队的成员。

pub fn get_members(group_id: &str) -> Result<Vec<User>, Error> {
    let client = Client::new();
    let query = format!("https://api.github.com/teams/{}/members?access_token={}",
                    group_id,
                    config::get_env(config::ENV_TOKEN));

    println!("{}", query);

    let mut res = try!(client
                    .get(&query)
                    .header(UserAgent("my/app".to_owned()))
                    .send());

    let mut body = String::new();
    try!(res.read_to_string(&mut body));
    try!(json::decode(&body));
}

有两种不同类型的错误。一个是hyper::error::Error,另一个是rustc_serialize::json::DecoderError

我以为我可以使用工具From<::hyper::error::Error> for ErrorFrom<rustc_serialize::json::DecoderError>。但由于io::Error和其他两个错误中的任何一个都不在我的箱子里,我不允许遵循这种方法。

我想知道去往这里的方式是什么。我是否需要提出自己的AppError类型,然后为此实现From<>特征?这是要走的路吗?

1 个答案:

答案 0 :(得分:5)

通常是的,使用您自己的错误类型是要走的路。甚至有几个板条箱(我现在只能找到this一个),它可以帮助您删除样板。当您编写库而不是应用程序时,也应该使用此方法。

但是,有一个选项可以使用Box<Error>特征对象作为错误类型。 Rust和第三方库中的大量错误类型实现了这一特性;因此,使用Result<..., Box<Error>>作为返回类型几乎应该始终有效。