Как расширить ошибки на основе быстрой ошибки? - PullRequest
0 голосов
/ 05 сентября 2018

Допустим, у меня есть ящик Lib1, который объявляет что-то вроде:

#[macro_use]
extern crate quick_error;

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

У меня есть другая библиотека Lib2, которая зависит от Lib1.

Я хотел бы расширить это MyError с некоторыми дополнительными ошибками, характерными для Lib2. Таким образом, я могу повторно использовать все базовые ошибки, которые были объявлены в Lib1.

Кстати, у меня есть полный контроль над обеими библиотеками, и я могу изменять их столько, сколько мне нужно. Я определенно хотел бы продолжать использовать quick-error для этого. Можно ли как-то продлить это?

Примечание: я уже посмотрел на Можно ли расширить перечисление дополнительными значениями? Это было определенно то, о чем я знал до открытия вопроса. Это не решает эту конкретную проблему. В идеале я хотел бы продолжать использовать quick_error. Плюс использование композиции для ошибок делает обработку ошибок в нисходящем направлении очень сложной. Есть ли хороший шаблон для расширения ошибок в библиотеках?

1 Ответ

0 голосов
/ 05 сентября 2018

Как описано в Можно ли расширить перечисление дополнительными значениями? , возможна композиция других перечислений и обычная практика для создания расширенного типа суммы, предназначенного для ошибок. Та же идея может быть применена к типам ошибок, созданным с помощью 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 столь же простым, как использование оператора ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...