anyhow
是一個 Rust 庫,用于簡化錯誤處理。雖然它非常靈活且易于使用,但不幸的是,你不能直接自定義 anyhow
庫本身。然而,你可以通過以下方法根據自己的需求定制錯誤處理:
std::error::Error
和 std::fmt::Display
trait。然后,你可以使用這個自定義錯誤類型替換 anyhow
的默認錯誤類型。use std::fmt;
use std::error;
#[derive(Debug)]
pub enum CustomError {
IoError(std::io::Error),
ParseError(std::num::ParseIntError),
// 其他自定義錯誤類型
}
impl fmt::Display for CustomError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
CustomError::IoError(err) => write!(f, "IO error: {}", err),
CustomError::ParseError(err) => write!(f, "Parse error: {}", err),
// 其他自定義錯誤類型的格式化
}
}
}
impl error::Error for CustomError {}
// 為其他錯誤類型實現 From trait
impl From<std::io::Error> for CustomError {
fn from(err: std::io::Error) -> CustomError {
CustomError::IoError(err)
}
}
impl From<std::num::ParseIntError> for CustomError {
fn from(err: std::num::ParseIntError) -> CustomError {
CustomError::ParseError(err)
}
}
anyhow
與自定義錯誤類型:在你的代碼中,使用 anyhow::Result
類型,并在出現錯誤時返回自定義錯誤類型。use anyhow::{Context, Result};
fn read_file_contents(file_path: &str) -> Result<String> {
std::fs::read_to_string(file_path).context("Failed to read file")
}
fn main() -> Result<()> {
let contents = read_file_contents("example.txt")?;
println!("File contents: {}", contents);
Ok(())
}
這樣,你就可以使用自定義錯誤類型處理錯誤,同時仍然利用 anyhow
的便利功能。