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

Chr*_*oph 3 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));
}
Run Code Online (Sandbox Code Playgroud)

有两种不同类型的错误可供使用.一个是hyper::error::Error另一个是rustc_serialize::json::DecoderError.

我以为我可以使用工具From<::hyper::error::Error> for ErrorFrom<rustc_serialize::json::DecoderError>.但由于io::Error我的箱子中没有其他两个错误也没有,我不允许遵循这种方法.

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

Vla*_*eev 5

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

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