如何基于快速错误扩展错误?

时间:2018-09-05 00:13:06

标签: rust

假设我有一个板条箱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。另外,使用组合来处理错误会使下游的错误处理非常复杂。有扩展库中错误的好方法吗?

1 个答案:

答案 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运算符一样简单。