use std::error::Error;
// 定义网络错误类型
#[derive(Debug)]
struct NetworkError;
impl std::fmt::Display for NetworkError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Network error occurred")
}
}
impl Error for NetworkError {}
// 定义解析错误类型
#[derive(Debug)]
struct ParseError;
impl std::fmt::Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Parse error occurred")
}
}
impl Error for ParseError {}
// 模拟从API获取数据的函数
fn get_data_from_api() -> Result<String, Box<dyn Error>> {
// 这里假设会随机返回一种错误来模拟真实情况
if rand::random::<bool>() {
Err(Box::new(NetworkError))
} else {
Err(Box::new(ParseError))
}
}
// 定义fetch_user_data函数
fn fetch_user_data() -> Result<String, Box<dyn Error>> {
get_data_from_api()
}
fn main() {
match fetch_user_data() {
Ok(data) => println!("Successfully fetched user data: {}", data),
Err(e) => eprintln!("Error: {}", e),
}
}
错误处理和错误传播机制解释
- 错误类型定义:
NetworkError
和ParseError
分别定义为结构体,并实现了std::fmt::Display
和std::error::Error
trait,这样它们就能作为错误类型进行处理和传播。
get_data_from_api
函数:该函数可能返回NetworkError
或ParseError
,通过Result
类型来表示可能的成功或失败,失败时返回Box<dyn Error>
,这种方式实现了错误的向上传播。
fetch_user_data
函数:它简单地调用get_data_from_api
并直接返回其结果,从而将get_data_from_api
可能产生的错误继续向上传播。
- 错误捕获和处理:在
main
函数中,使用match
语句对fetch_user_data
的返回值进行处理。如果是Ok
,则打印成功获取的数据;如果是Err
,则使用eprintln!
打印错误信息,因为错误信息通常应该输出到标准错误流。这种方式实现了在调用处统一捕获并处理可能发生的各种错误。