anyhow
是一個 Rust 庫,用于簡化錯誤處理。它提供了一個 Result
類型,可以表示成功或失敗的結果。當你在代碼中使用 anyhow
時,你可以使用 ?
運算符來傳播錯誤。如果 Result
是 Err
,則會立即返回錯誤;如果是 Ok
,則會解包值并繼續執行。
下面是一個簡單的示例,展示了如何使用 anyhow
處理錯誤:
use anyhow::Result;
fn main() -> Result<()> {
let file_content = read_file("non_existent_file.txt")?;
println!("File content: {}", file_content);
let result = divide(10, 0)?;
println!("Result: {}", result);
Ok(())
}
fn read_file(file_name: &str) -> Result<String> {
std::fs::read_to_string(file_name).map_err(|err| {
anyhow::anyhow!("Failed to read file {}: {}", file_name, err)
})
}
fn divide(a: i32, b: i32) -> Result<i32> {
if b == 0 {
Err(anyhow::anyhow!("Division by zero"))
} else {
Ok(a / b)
}
}
在這個示例中,我們定義了三個函數:main
、read_file
和 divide
。main
函數調用 read_file
和 divide
函數,并使用 ?
運算符處理錯誤。如果發生錯誤,anyhow
會生成一個描述性的錯誤消息,并立即返回。
read_file
函數嘗試讀取一個文件的內容。如果文件不存在或無法讀取,它會使用 map_err
將標準錯誤轉換為 anyhow::Error
類型,并添加一個描述性消息。
divide
函數執行除法操作。如果除數為零,它會返回一個錯誤,否則返回結果。