假设我有一个 crate Lib1
声明如下内容:
#[macro_use]
extern crate quick_error;
quick_error! {
#[derive(Debug)]
pub enum MyError {
Foo {
description("FooError")
}
}
}
我还有一些依赖于 Lib1
的库 Lib2
。
我想用一些特定于 Lib2
的附加错误来扩展此 MyError
。这样我就可以重用在 Lib1
中声明的所有基本错误。
顺便说一句,我可以完全控制这两个库,并且可以根据需要修改它们。为此,我绝对愿意继续使用 quick-error
。是否有可能以某种方式扩展它?
注意:我已经看过 Can I extend an enum with additional values?在打开问题之前,这绝对是我所知道的。
这并不能解决这个具体问题。理想情况下,我想继续使用 quick_error
。再加上对错误使用组合会使下游的错误处理变得非常复杂。是否有用于扩展库中错误的良好模式?
最佳答案
如 Can I extend an enum with additional values? 中所述,其他枚举的组合是可能的,并且是创建指定给错误的扩展和类型的常见做法。同样的想法可以应用于使用 quick_error
创建的错误类型,将其他错误作为您自己类型的 原因 传递。考虑一个假设的 crate lib2
:
#[macro_use]
extern crate quick_error;
extern crate lib2;
quick_error! {
#[derive(Debug)]
pub enum MyError {
Foo {
description("FooError")
},
Lib2(err: lib2::Error) {
description("Failed to do something done by lib2")
from() // derive `From<lib2::Error>`, very useful
cause(err)
}
}
}
from()
子句使编译器派生 From<lib2::Error>
对于 MyError
.这特别有用,因为它可以提高 Result<T, MyError>
在 lib2
上错误就像使用 ?
一样简单运营商。
关于rust - 如何基于快速错误扩展错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52175430/