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

Tim*_*mmm 8 rust

我有这个代码:

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

    let repo = git2::Repository::open(".")?;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

    let repo = git2::Repository::open(".")?;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我试过添加这个:

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

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

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

She*_*ter 8

如果一个类型实现了std::error::Error实现了Display

pub trait Error: Debug + Display {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

ToString提供方法的traitto_string是为任何实现 的类型实现的Display

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

use git2; // 0.13.2

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