Как использовать `.kind ()` для моих пользовательских ошибок? - PullRequest
0 голосов
/ 11 июля 2020

Мне интересно, как я могу выполнить некоторое сопоставление шаблонов с моими пользовательскими ошибками, чтобы иметь особое c поведение для некоторых ошибок и общее c поведение для остальных.

I иметь следующую настраиваемую ошибку, определенную с помощью thiserror, поскольку это, по-видимому, последний рекомендуемый ящик для настраиваемых ошибок в июле 2020 года.

#[derive(thiserror::Error, Debug)]
pub enum MyError{
    #[error("Error while building the query")]
    Builder(#[source] hyper::http::Error),

    #[error("Generic error")]
    Fuck,
    
    #[error("Not OK HTTP response code")]
    NotOK,
    
    #[error("Request error")]
    Request(#[source] hyper::Error),
}
pub async fn do_http_stuff() -> Result<Vec<u8>, MyError> {
   ...
}

И:

    match do_http_stuff().await {
      Ok(data) => ...,
      Err(error) => match error.kind() {
        MyError::NotOK => {
          println!("not ok");
        },
        _ => {
          println!("{}", error.to_string());
        },
      },
    },

Но .kind() не реализован. Когда я ищу, как управлять ошибками в ржавчине, в примерах часто бывает доброта. Какие заклинания мне нужно сделать, чтобы в моем проекте был этот .kind() метод или что-то подобное?

Спасибо.

1 Ответ

2 голосов
/ 11 июля 2020

Полагаю, вы имеете в виду метод std::io::Error:kind. Это специально для ошибок ввода-вывода. Поскольку он должен представлять ошибки ОС, io::Error не определяется как перечисление, и мы не можем сопоставить его. Метод kind позволяет нам получить ErrorKind, представляющий общую c причину ошибки независимо от платформы.

Этот обходной путь совершенно не нужен в обычной библиотеке Rust, как и все ваши случаи ошибок можно выразить просто (как варианты вашего enum). Все, что вам нужно сделать, это напрямую сопоставить значение error

...