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

标签 rust

假设我有一个 crate Lib1 声明如下内容:

#[macro_use]
extern crate quick_error;

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

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

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

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

注意:我已经看过 Can I extend an enum with additional values?在打开问题之前,这绝对是我所知道的。 这并不能解决这个具体问题。理想情况下,我想继续使用 quick_error。再加上对错误使用组合会使下游的错误处理变得非常复杂。是否有用于扩展库中错误的良好模式?

最佳答案

Can I extend an enum with additional values? 中所述,其他枚举的组合是可能的,并且是创建指定给错误的扩展和类型的常见做法。同样的想法可以应用于使用 quick_error 创建的错误类型,将其他错误作为您自己类型的 原因 传递。考虑一个假设的 crate 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 上错误就像使用 ? 一样简单运营商。

关于rust - 如何基于快速错误扩展错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52175430/

相关文章:

rust - 如何找到 `derive` 中使用的符号的定义位置?

rust - 是什么使 `impl Trait` 作为参数 "universal"和作为返回值 "existential"?

generics - 如何使用 `u32` 或 `&u32` 的任何迭代器编写通用函数?

rust - 为什么在函数内部改变传递的选项不会传播到外部的选项?

rust - 为什么对我的 FFI 函数的第二次调用无法匹配字符串比较?

string - 如何使用迭代器确定两个字符串在函数式风格中是否只有一个不同的字符?

rust - 在 Iron 和 Hyper 中重用 hyper::client 和 tokio_core

macros - 在宏中构建枚举

string - 查找连续相等字符的最长子串时出现 "borrowed value does not live long enough"错误如何处理?

linux - 使用rust : error cross-compilation from Linux to Windows i686