LINUX.ORG.RU

История изменений

Исправление loyd, (текущая версия) :

Это известная проблема и причина, почему обобщённые ошибки в anyhow, eyre, failure не реализуют std::error::Error.

Ситуация в будущем несколько улучшится со стабилизацией специализации, но сейчас красивого решения нет.

Насколько я понимаю, у тебя ошибка твоей библиотеки (иначе зачем ещё thiserror, а не обобщённая ошибка). Самое простое здесь это конкретные From инстансы:

impl From<hyper::Error> for MyError {
    fn from(error: hyper::Error) -> Self {
        Self::Network(Box::new(error)) // Box<dyn ...>
    }
}

Минус этого решения в том, что эти инсансы являются частью публичного интерфейса и поэтому раскрывают реализацию. Поэтому более чистое решение это всё-таки приватные MyError::network(..) конструкторы. Да, ? не заиспользовать сразу, придётся делать res.map_err(MyError::network)?, но зато реализация скрытой получается.


Если же у тебя приложение и тебе деление на варианты (Network/Codec/etc) не нужны, то просто используй готовые eyre/anyhow. Они не реализуют std::error::Error, но это и неважно для небиблиотечного кода.

Исходная версия loyd, :

Это известная проблема и причина, почему обобщённые ошибки в anyhow, eyre, failure не реализуют std::error::Error.

Ситуация в будущем несколько улучшится со стабилизацией специализации, но сейчас красивого решения нет.

Насколько я понимаю, у тебя ошибка твоей библиотеки (иначе зачем ещё thiserror, а не обобщённая ошибка). Самое простое здесь это конкретные From инстансы:

impl From<hyper::Error> for MyError {
    fn from(error: hyper::Error) -> Self {
        Self::Network(Box::new(error)) // Box<dyn ...>
    }
}

Минус этого решения в том, что эти инсансы являются частью публичного интерфейса и поэтому раскрывают реализацию. Поэтому более чистое решение это всё-таки приватные MyError::network(..) конструкторы. Да, ? не заиспользовать сразу, придётся делать res.map_err(MyError::network)?, но зато реализация скрытой получается.