un1t
@un1t

Как правильно обработать ошибку?

Сделал кастомную ошибку в виде enum, а функция возвращяет Result<String, Box<dyn Error>>.
Не знаю как сматчить ошибку, пишет

mismatched types
expected struct `Box<dyn std::error::Error>`
     found enum `CacheError`


Код
use std::error::Error;

#[derive(Debug, thiserror::Error)]
pub enum CacheError {
    #[error("key not found")]
    KeyNotFound,
}

pub struct Cache {

}

impl Cache {
    pub fn set(&self, key: &String, value: &String) -> Result<(), Box<dyn Error>>{
        Ok(())
    }

    pub fn get(&self, key: &String) -> Result<String, Box<dyn Error>> {
        Err(CacheError::KeyNotFound.into())
    }blockquote
}


let cache= cache::Cache{};

let value = match cache.get("somekey".to_string()) {
    Ok(v) => v,
    Err(cache::CacheError::KeyNotFound) => {
        // тут делается запрос к API
    },
    Err(err) => panic!("{}", err),
};


Или возвращатьBox<dyn Error>плохая идея, а нужно засовывать другие ошибки внутрь своего кастомного типа?
Много прочитал информации про обработку ошибок и rust-book и статьи и доклады, но пока понятной картины у меня не сложилось.
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист

Или возвращатьBoxплохая идея, а нужно засовывать другие ошибки внутрь своего кастомного типа?

Ага. Много где в библиотеках внутренние ошибки заворачиваются/конвертируются в кастомный тип. Как раз по причине того что боксить - не бесплатно, а dyn - это не удобно для потребителя.

В принципе можно, в теории dyn распаковать, но это антипаттерн
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы