[英]How to implement From trait for custom error types?
我目前正在尝试为CLI应用程序编写自定义错误类型。 现在,我想编写From
特性的实现,以便我的自定义错误类型可以包装可能发生的所有第三方库错误。
错误枚举:
#[derive(Debug)] // Allow the use of "{:?}" format specifier
pub enum CustomError {
Git(git2::Error),
Other
}
现在我想为git2
库中的git2::Error
实现From
Trait以使用?
操作员在我的职能。
impl From<(git2::Error)> for CustomError {
fn from(cause: git2::Error) -> Self {
CustomError::Git(cause)
}
}
但是,当我尝试使用自定义错误来映射这样的错误时:
let repo = Repository::open(path).map_err(|err| CustomError::Git)?;
我收到以下错误消息:
the trait `std::convert::From<fn(git2::error::Error) -> error::CustomError {error::CustomError::Git}>` is not implemented for `error::CustomError `
谁能帮助我了解为什么会出现此错误以及如何解决此问题?
任何帮助表示赞赏
您混合了很多概念; 让我们看看我们是否可以一起解决所有问题,并希望将其全部澄清。
git2
板条箱有自己的错误类型,您无疑已经发现了。 您对自定义错误的定义也很好。
问题是双重的:
From<_>
From<E>
允许您通过提供翻译功能( from()
)将类型从一种类型转换为另一种类型。
您对此的实现如下:
impl From<(git2::Error)> for CustomError {
fn from(cause: git2::Error) -> Self {
CustomError::Git(cause)
}
}
不会在不应有的地方添加rust
支架,这正是这种情况的一种。 这样,您实际上定义了From<(T)>
而不是From<T>
。 这是错误的#1。
正确的实现只是将方括号括起来:
impl From<git2::Error> for CustomError {
fn from(cause) -> Self {
CustomError::Git(cause)
}
}
本质上不是错误,而是作为?
完全不必要的操作?
操作员会为您处理。 不需要map_err()
,如果有的话,您将使用into()
而不是硬调用类型(该类型应该已经在您的函数中定义为类型)。
请记住,转换特性的全部要点是定义它们, 因此您不必显式调用它们 。
工作顺序的最终“演示”版本代码如下所示:
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!");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.