假设我有一个板条箱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
。另外,使用组合来处理错误会使下游的错误处理非常复杂。有扩展库中错误的好方法吗?
答案 0 :(得分:2)
如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>
的{{1}}。这特别有用,因为它使对MyError
的错误引发Result<T, MyError>
就像使用lib2
运算符一样简单。