【问题标题】:How to extend errors based on quick-error?如何基于快速错误扩展错误?
【发布时间】:2018-09-05 00:13:05
【问题描述】:

假设我有一个板条箱Lib1,它声明了如下内容:

#[macro_use]
extern crate quick_error;

quick_error! {
    #[derive(Debug)]
    pub enum MyError {
        Foo {
            description("FooError")
        }
    }
}

我还有一些依赖于Lib1 的库Lib2。

我想扩展这个MyError,添加一些特定于Lib2 的额外错误。这样我就可以重用在Lib1 中声明的所有基本错误。

顺便说一句,我可以完全控制这两个库,并且可以根据需要修改它们。我绝对想继续使用quick-error。是否有可能以某种方式扩展它?

注意:我已经看过Can I extend an enum with additional values? 这绝对是我在打开问题之前就知道的事情。 这并不能解决这个特定问题。理想情况下,我想继续使用quick_error。另外,使用组合来处理错误会使下游的错误处理变得非常复杂。有没有很好的模式来扩展库中的错误?

【问题讨论】:

标签: rust


【解决方案1】:

如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() 子句使编译器为MyError 派生From&lt;lib2::Error&gt;。这特别有用,因为它使得在 lib2 错误上引发 Result&lt;T, MyError&gt; 就像使用 ? 运算符一样简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多