如何根据快速错误扩展错误?

问题描述 投票:1回答:1

假设我有一个箱子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。另外,使用组合作为错误使下游的错误处理非常复杂。是否有一个很好的模式来扩展库中的错误?

rust
1个回答
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>派生MyError。这特别有用,因为它使得在Result<T, MyError>误差上提高lib2就像使用?算子一样简单。

© www.soinside.com 2019 - 2024. All rights reserved.