派生错误枚举
thiserror crate 是创建错误枚举的常用方法, 就像前一页中提供的示例一样:
use std::{fs, io}; use std::io::Read; use thiserror::Error; #[derive(Debug, Error)] enum ReadUsernameError { #[error("Could not read: {0}")] IoError(#[from] io::Error), #[error("Found no username in {0}")] EmptyUsername(String), } fn read_username(path: &str) -> Result<String, ReadUsernameError> { let mut username = String::new(); fs::File::open(path)?.read_to_string(&mut username)?; if username.is_empty() { return Err(ReadUsernameError::EmptyUsername(String::from(path))); } Ok(username) } fn main() { //fs::write("config.dat", "").unwrap(); match read_username("config.dat") { Ok(username) => println!("Username: {username}"), Err(err) => println!("Error: {err}"), } }
thiserror
的派生宏会自动实现 std::error::Error
,并且可以选择性地实现 Display
(如果提供了 #[error(...)]
属性)和 From
(如果添加了 #[from]
属性)。 此规则也适用于结构体。
但是,此规则不会影响公共 API,对于库而言,这非常理想。