我想知道如何对我的自定义错误进行某种模式匹配,以使某些错误具有特定的行为,而对其他错误具有通用的行为。
我有以下使用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()
或类似的方法吗?
谢谢。
答案 0 :(得分:2)
我希望您引用的是std::io::Error:kind
方法。它专门用于IO错误。由于io::Error
不能代表操作系统错误,因此未定义为枚举,因此我们无法对其进行匹配。 kind
方法使我们能够以与平台无关的方式获得表示错误的一般原因的ErrorKind
。
在一般的Rust库中,完全不需要这种解决方法,因为所有错误情况都可以简单地表示(作为enum
的变体)。您需要做的就是直接匹配error
值