假设我有一个箱子Lib1
,声明如下:
#[macro_use]
extern crate quick_error;
quick_error! {
#[derive(Debug)]
pub enum MyError {
Foo {
description("FooError")
}
}
}
我有另一个库Lib2
依赖于Lib1
。
我想扩展这个MyError
以及一些特定于Lib2
的其他错误。这样我就可以重用Lib1
中声明的所有基本错误。
顺便说一句,我完全控制了两个库,我可以根据需要修改它们。我绝对想继续使用quick-error
。有可能以某种方式扩展它吗?
注意:我已经看过Can I extend an enum with additional values?在打开这个问题之前,这绝对是我所知道的。这并不能解决这个具体问题。理想情况下,我想继续使用quick_error
。另外,使用组合作为错误使下游的错误处理非常复杂。是否有一个很好的模式来扩展库中的错误?
如Can I extend an enum with additional values?中所述,其他枚举的组合是可能的,并且通常的做法是创建指定为错误的扩展和类型。通过将其他错误作为您自己类型的原因传递,可以将相同的想法应用于使用quick_error
创建的错误类型。考虑一个假设的箱子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
就像使用?
算子一样简单。