如何在自定义错误上使用`.kind()`?

时间:2020-07-11 08:21:15

标签: error-handling rust

我想知道如何对我的自定义错误进行某种模式匹配,以使某些错误具有特定的行为,而对其他错误具有通用的行为。

我有以下使用thiserror定义的自定义错误,因为它似乎是2020年7月针对自定义错误的最新推荐工具箱。

#[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 个答案:

答案 0 :(得分:2)

我希望您引用的是std::io::Error:kind方法。它专门用于IO错误。由于io::Error不能代表操作系统错误,因此未定义为枚举,因此我们无法对其进行匹配。 kind方法使我们能够以与平台无关的方式获得表示错误的一般原因的ErrorKind

在一般的Rust库中,完全不需要这种解决方法,因为所有错误情况都可以简单地表示(作为enum的变体)。您需要做的就是直接匹配error