在 Rust 中,處理嵌套錯誤的一種方法是使用 Result
和 ?
運算符。?
運算符可以用于簡化錯誤傳播,它會將當前函數的錯誤結果向上層函數傳遞,并在遇到錯誤時提前返回。這里有一個簡單的例子來說明如何處理嵌套錯誤:
use std::fs::File;
use std::io::Read;
use std::io;
// 定義一個自定義錯誤類型
#[derive(Debug)]
enum CustomError {
IoError(io::Error),
ParseError(std::num::ParseIntError),
}
// 為 `CustomError` 實現 `From` trait,以便可以從 `io::Error` 和 `std::num::ParseIntError` 自動轉換
impl From<io::Error> for CustomError {
fn from(error: io::Error) -> Self {
CustomError::IoError(error)
}
}
impl From<std::num::ParseIntError> for CustomError {
fn from(error: std::num::ParseIntError) -> Self {
CustomError::ParseError(error)
}
}
// 一個函數,從文件中讀取內容并將其解析為整數
fn read_and_parse(file_path: &str) -> Result<i32, CustomError> {
// 打開文件
let mut file = File::open(file_path)?;
let mut content = String::new();
// 讀取文件內容
file.read_to_string(&mut content)?;
// 解析內容
let number: i32 = content.trim().parse()?;
Ok(number)
}
fn main() {
match read_and_parse("example.txt") {
Ok(number) => println!("The number is: {}", number),
Err(e) => match e {
CustomError::IoError(io_error) => println!("IO error: {:?}", io_error),
CustomError::ParseError(parse_error) => println!("Parse error: {:?}", parse_error),
},
}
}
在這個例子中,我們定義了一個自定義錯誤類型 CustomError
,它包含了 io::Error
和 std::num::ParseIntError
。我們還為 CustomError
實現了 From
trait,以便可以從這兩種錯誤類型自動轉換。
read_and_parse
函數嘗試打開一個文件,讀取其內容并將其解析為整數。如果在這個過程中遇到任何錯誤,它將使用 ?
運算符將錯誤向上層函數傳遞。在 main
函數中,我們使用 match
語句處理可能的錯誤,并根據錯誤類型輸出相應的信息。