Error handling 如何实现自定义错误类型的From trait?

Error handling 如何实现自定义错误类型的From trait?,error-handling,rust,Error Handling,Rust,我当前正在尝试为我的CLI应用程序编写自定义错误类型。现在我想写一个来自trait的实现,这样我的自定义错误类型就可以包装所有可能发生的第三方库错误 错误枚举: #[derive(Debug)] // Allow the use of "{:?}" format specifier pub enum CustomError { Git(git2::Error), Other } 现在我想为git2库中的git2::Error实现From特性,以便在函数中使用?操作符 impl

我当前正在尝试为我的CLI应用程序编写自定义错误类型。现在我想写一个来自trait的
实现,这样我的自定义错误类型就可以包装所有可能发生的第三方库错误

错误枚举:

#[derive(Debug)] // Allow the use of "{:?}" format specifier
pub enum CustomError {
    Git(git2::Error),
    Other
}
现在我想为
git2
库中的
git2::Error
实现
From
特性,以便在函数中使用
操作符

impl From<(git2::Error)> for CustomError {
    fn from(cause: git2::Error) -> Self {
        CustomError::Git(cause)
    }
}
我收到以下错误消息:

the trait `std::convert::From<fn(git2::error::Error) -> error::CustomError {error::CustomError::Git}>` is not implemented for `error::CustomError `
特性'std::convert::From error::CustomError{error::CustomError::Git}>`没有为'error::CustomError'实现`
有人能帮我理解为什么我会犯这个错误,以及如何解决这个问题吗


感谢您的帮助

您混淆了一大堆概念;让我们看看我们是否能一起解决这个问题,并希望能澄清所有问题

git2
板条箱有自己的错误类型,您无疑已经发现了。您对自定义错误的定义也很好

问题有两个方面:

  • 您从
  • From
    允许您通过提供翻译功能(
    From()
    )将类型从一种类型转换为另一种类型

    您的实施情况如下:

    impl From<(git2::Error)> for CustomError {
        fn from(cause: git2::Error) -> Self {
            CustomError::Git(cause)
        }
    }
    
  • 您的实际转换
  • 这本身不是一个错误,而是一个完全不必要的操作,因为
    操作员会为您处理它。不需要使用
    map\u err()
    ,如果需要,您将使用
    into()
    ,而不是硬调用该类型(该类型应已定义为函数中的类型)

    记住,转换特征的全部要点是定义它们,这样你就不必显式地调用它们

    处于工作状态的代码的最终“演示”版本可能如下所示:

    let repo = Repository::open(path).map_err(|err| CustomError::Git)?;
    
    extern crate git2;
    use git2::Repository;
    
    #[derive(Debug)] // Allow the use of "{:?}" format specifier
    pub enum CustomError {
        Git(git2::Error),
        Other
    }
    impl From<(git2::Error)> for CustomError {
        fn from(cause: git2::Error) -> Self {
            CustomError::Git(cause)
        }
    }
    fn test() -> Result<(), CustomError> {
        let path = "foo";
        let output = Repository::open(path)?;
        Ok(())
    }
    fn main() {
        println!("Hello, world!");
    }
    
    extern板条箱git2;
    使用git2::Repository;
    #[派生(调试)]//允许使用“{:?}”格式说明符
    发布枚举自定义错误{
    Git(git2::Error),
    其他
    }
    针对CustomError的impl From{
    fn from(原因:git2::Error)->Self{
    CustomError::Git(原因)
    }
    }
    fn test()->结果{
    让path=“foo”;
    让输出=存储库::打开(路径)?;
    好(())
    }
    fn main(){
    println!(“你好,世界!”);
    }
    
    你混淆了一大堆概念;让我们看看我们是否能一起解决这个问题,并希望能澄清所有问题

    git2
    板条箱有自己的错误类型,您无疑已经发现了。您对自定义错误的定义也很好

    问题有两个方面:

  • 您从
  • From
    允许您通过提供翻译功能(
    From()
    )将类型从一种类型转换为另一种类型

    您的实施情况如下:

    impl From<(git2::Error)> for CustomError {
        fn from(cause: git2::Error) -> Self {
            CustomError::Git(cause)
        }
    }
    
  • 您的实际转换
  • 这本身不是一个错误,而是一个完全不必要的操作,因为
    操作员会为您处理它。不需要使用
    map\u err()
    ,如果需要,您将使用
    into()
    ,而不是硬调用该类型(该类型应已定义为函数中的类型)

    记住,转换特征的全部要点是定义它们,这样你就不必显式地调用它们

    处于工作状态的代码的最终“演示”版本可能如下所示:

    let repo = Repository::open(path).map_err(|err| CustomError::Git)?;
    
    extern crate git2;
    use git2::Repository;
    
    #[derive(Debug)] // Allow the use of "{:?}" format specifier
    pub enum CustomError {
        Git(git2::Error),
        Other
    }
    impl From<(git2::Error)> for CustomError {
        fn from(cause: git2::Error) -> Self {
            CustomError::Git(cause)
        }
    }
    fn test() -> Result<(), CustomError> {
        let path = "foo";
        let output = Repository::open(path)?;
        Ok(())
    }
    fn main() {
        println!("Hello, world!");
    }
    
    extern板条箱git2;
    使用git2::Repository;
    #[派生(调试)]//允许使用“{:?}”格式说明符
    发布枚举自定义错误{
    Git(git2::Error),
    其他
    }
    针对CustomError的impl From{
    fn from(原因:git2::Error)->Self{
    CustomError::Git(原因)
    }
    }
    fn test()->结果{
    让path=“foo”;
    让输出=存储库::打开(路径)?;
    好(())
    }
    fn main(){
    println!(“你好,世界!”);
    }
    
    非常感谢您非常全面的回答和解释。现在一切都变得更有意义了。这也适用于转换
    ok\u或
    中的错误吗?只要编译器期望(由于类型)您的自定义错误类型,但从不同的开始,它就会工作-它会检查它是否可以转换。非常感谢您非常全面的回答和解释。现在一切都变得更有意义了。这也适用于转换
    ok\u或
    中的错误吗?只要编译器期望(由于类型)您的自定义错误类型,但从不同的开始,它就会工作-它检查是否可以转换。