面试题答案
一键面试适合使用可恢复异常(Result
类型)处理错误的场景及原因
- 输入验证场景:例如用户注册时输入的邮箱格式验证。如果邮箱格式错误,使用
Result
类型可以清晰地返回错误信息,告知用户如何修正,同时调用方可以根据Result
结果决定下一步操作,如提示用户重新输入。因为这种情况下错误是可预期且可恢复的,通过修正输入即可继续正常流程。 - 资源获取场景:当获取数据库连接时,如果连接失败(如数据库服务器暂时不可用),使用
Result
类型可以返回失败原因,调用方可以选择等待一段时间后重试获取连接。这种场景下错误并非永久性,经过一定处理后可恢复正常操作。 - 外部服务调用场景:调用第三方支付接口时,可能由于网络波动等原因导致调用失败。
Result
类型能返回具体错误,调用方可以根据错误决定是否重试调用第三方服务,因为网络波动等情况是临时的,可恢复的。
文件读取模块代码(以Rust语言为例)
use std::fs::File;
use std::io::{self, Read};
enum FileError {
FileNotFound,
PermissionDenied,
OtherIoError(io::Error),
}
type FileResult<T> = Result<T, FileError>;
fn read_file(file_path: &str) -> FileResult<String> {
let mut file = match File::open(file_path) {
Ok(file) => file,
Err(err) => match err.kind() {
io::ErrorKind::NotFound => return Err(FileError::FileNotFound),
io::ErrorKind::PermissionDenied => return Err(FileError::PermissionDenied),
_ => return Err(FileError::OtherIoError(err)),
},
};
let mut content = String::new();
match file.read_to_string(&mut content) {
Ok(_) => Ok(content),
Err(err) => Err(FileError::OtherIoError(err)),
}
}
调用该模块时错误处理方式
fn main() {
let result = read_file("nonexistent_file.txt");
match result {
Ok(content) => println!("File content: {}", content),
Err(FileError::FileNotFound) => println!("The file was not found. Please check the path."),
Err(FileError::PermissionDenied) => println!("You do not have permission to read this file."),
Err(FileError::OtherIoError(err)) => println!("An I/O error occurred: {}", err),
}
}
在调用read_file
函数时,通过match
语句对Result
类型的返回值进行处理,根据不同的错误类型给出针对性的提示信息,优雅地处理可能出现的错误,避免程序因为文件读取错误而崩溃。