轻松将第三方错误转换为字符串

时间:2017-01-30 16:24:39

标签: rust

我有这段代码:

fn do_stuff() -> Result<i32, String> {

    let repo = git2::Repository::open(".")?;
    // ...
}

这不起作用,因为git2::Repository::open()的错误类型不是String。 (是的,我通过使用字符串来处理我的错误非常懒惰。它是一个小程序;起诉我。)

error[E0277]: the trait bound `std::string::String: std::convert::From<git2::Error>` is not satisfied
  --> src/main.rs:94:13
   |
94 |    let repo = Repository::open(".")?;
   |               ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<git2::Error>` is not implemented for `std::string::String`
   |
   = help: the following implementations were found:
   = help:   <std::string::String as std::convert::From<&'a str>>
   = help:   <std::string::String as std::convert::From<std::borrow::Cow<'a, str>>>
   = note: required by `std::convert::From::from`

我已尝试添加此内容:

impl std::convert::From<git2::Error> for String {
    fn from(err: git2::Error) -> Self {
        err.to_string()
    }
}

但这是不允许的,因为它没有引用此箱子中定义的任何类型。

我知道我可以使用.map_err(),但我真的希望自动发生。我觉得我之前也有这个工作,这有点烦人!

2 个答案:

答案 0 :(得分:4)

如果某个类型实现了std::error::Errorit also implements Display

pub trait Error: Debug + Display {
    fn description(&self) -> &str;

    fn cause(&self) -> Option<&Error> { ... }
}

提供方法to_string的{​​{3}}特征是针对实现Display的任何类型实现的。

因此,任何实现Error的类型都可以通过String转换为to_string

extern crate git2;

fn do_stuff() -> Result<i32, String> {
    let repo = git2::Repository::open(".").map_err(|e| e.to_string())?;
    unimplemented!()
}

答案 1 :(得分:2)

事实证明这有一点in the Rust book。它不允许您转换为String,但显然所有Error类型都可以转换为Box<Error>,所以我只是将String替换为label = ""。它也更清洁。