Error handling 如何在自定义错误上使用“.kind()”?

Error handling 如何在自定义错误上使用“.kind()”?,error-handling,rust,Error Handling,Rust,我想知道如何对我的自定义错误进行模式匹配,对一些错误有一个特定的行为,对其他错误有一个通用的行为 我有以下自定义错误,使用thisrerror定义,因为它似乎是2020年7月针对自定义错误推荐的最新板条箱 #[derive(thiserror::Error, Debug)] pub enum MyError{ #[error("Error while building the query")] Builder(#[source] hyper::http::Er

我想知道如何对我的自定义错误进行模式匹配,对一些错误有一个特定的行为,对其他错误有一个通用的行为

我有以下自定义错误,使用
thisrerror
定义,因为它似乎是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),
}
但是没有实现
.kind()
。当我研究如何管理rust中的错误时,示例中经常出现类似的情况。我应该做什么样的咒语才能在我的项目中使用这个
.kind()
方法或类似的方法


谢谢。

我想你指的是
std::io::Error:kind
方法。这是专门针对IO错误的。因为它需要能够表示操作系统错误,
io::Error
没有定义为枚举,我们无法匹配它。
kind
方法允许我们获得一个
ErrorKind
,以独立于平台的方式表示错误的一般原因


在普通的Rust库中完全不需要这种变通方法,因为所有的错误案例都可以简单地表示出来(作为
enum
的变体)。您需要做的就是直接匹配
error

我希望您指的是
std::io::error:kind
方法。这是专门针对IO错误的。因为它需要能够表示操作系统错误,
io::Error
没有定义为枚举,我们无法匹配它。
kind
方法允许我们获得一个
ErrorKind
,以独立于平台的方式表示错误的一般原因

在普通的Rust库中完全不需要这种变通方法,因为所有的错误案例都可以简单地表示出来(作为
enum
的变体)。您只需直接匹配
错误
值即可

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());
        },
      },
    },