Error handling 如何实现自定义错误类型的From trait?
我当前正在尝试为我的CLI应用程序编写自定义错误类型。现在我想写一个来自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
实现,这样我的自定义错误类型就可以包装所有可能发生的第三方库错误
错误枚举:
#[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或中的错误吗?只要编译器期望(由于类型)您的自定义错误类型,但从不同的开始,它就会工作-它检查是否可以转换。