面试题答案
一键面试1. 设计模式:Result和Option枚举结合自定义错误类型
在Rust中,Result
和Option
枚举是处理错误和可能缺失值的核心工具。对于编译时错误,我们可以通过类型系统来捕获,而对于运行时错误,我们可以使用Result
枚举来处理。同时,定义自定义错误类型可以使错误处理更加清晰和可维护。
自定义错误类型
首先,定义一个自定义错误类型,它通常实现std::error::Error
trait。
use std::fmt;
// 自定义错误类型
#[derive(Debug)]
enum MyError {
TypeMismatch,
FileSystemError(std::io::Error),
}
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MyError::TypeMismatch => write!(f, "类型不匹配错误"),
MyError::FileSystemError(ref err) => write!(f, "文件系统错误: {}", err),
}
}
}
impl std::error::Error for MyError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
MyError::FileSystemError(ref err) => Some(err),
_ => None,
}
}
}
函数中使用Result处理错误
接下来,展示如何在函数中使用Result
来处理错误。
// 模拟一个可能因为类型不匹配出错的函数
fn divide(a: i32, b: i32) -> Result<i32, MyError> {
if b == 0 {
Err(MyError::TypeMismatch)
} else {
Ok(a / b)
}
}
// 模拟一个可能因为文件系统操作失败出错的函数
use std::fs::File;
fn read_file_content(file_path: &str) -> Result<String, MyError> {
let file = File::open(file_path).map_err(MyError::FileSystemError)?;
let mut content = String::new();
file.read_to_string(&mut content).map_err(MyError::FileSystemError)?;
Ok(content)
}
多层函数调用中的错误传递
在多层函数调用中,我们可以使用?
操作符来简洁地传递错误。
fn process_data() -> Result<(), MyError> {
let result = divide(10, 2)?;
let content = read_file_content("example.txt")?;
println!("计算结果: {}, 文件内容: {}", result, content);
Ok(())
}
错误处理
最后,在main
函数中调用process_data
并处理可能的错误。
fn main() {
if let Err(e) = process_data() {
eprintln!("发生错误: {}", e);
}
}
2. 总结
通过自定义错误类型并结合Result
枚举,我们可以有效地统一处理编译时和运行时错误。在多层函数调用中,?
操作符使得错误传递简洁明了,提高了代码的健壮性和可维护性。Option
枚举可以用于处理可能缺失值的情况,与Result
配合使用,进一步完善错误处理机制。