我想写一个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 Error
和From<rustc_serialize::json::DecoderError>
。但由于io::Error
和其他两个错误中的任何一个都不在我的箱子里,我不允许遵循这种方法。
我想知道去往这里的方式是什么。我是否需要提出自己的AppError
类型,然后为此实现From<>
特征?这是要走的路吗?
答案 0 :(得分:5)
通常是的,使用您自己的错误类型是要走的路。甚至有几个板条箱(我现在只能找到this一个),它可以帮助您删除样板。当您编写库而不是应用程序时,也应该使用此方法。
但是,有一个选项可以使用Box<Error>
特征对象作为错误类型。 Rust和第三方库中的大量错误类型实现了这一特性;因此,使用Result<..., Box<Error>>
作为返回类型几乎应该始终有效。