面试题答案
一键面试use std::error::Error;
use std::fmt;
use std::fs::read;
// 定义错误类型
#[derive(Debug)]
struct DataLoadError;
impl fmt::Display for DataLoadError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Data load error")
}
}
impl Error for DataLoadError {}
#[derive(Debug)]
struct DataParseError;
impl fmt::Display for DataParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Data parse error")
}
}
impl Error for DataParseError {}
#[derive(Debug)]
struct DataAnalysisError;
impl fmt::Display for DataAnalysisError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Data analysis error")
}
}
impl Error for DataAnalysisError {}
// 定义数据模型
#[derive(Debug)]
struct DataModel;
#[derive(Debug)]
struct AnalysisResult;
// 定义结构体
struct DataProcessor;
impl DataProcessor {
fn load_data(&self) -> Result<Vec<u8>, DataLoadError> {
read("data_file.txt").map_err(|_| DataLoadError)
}
fn parse_data(&self, data: Vec<u8>) -> Result<DataModel, DataParseError> {
// 实际解析逻辑
Ok(DataModel)
}
fn analyze_data(&self, model: DataModel) -> Result<AnalysisResult, DataAnalysisError> {
// 实际分析逻辑
Ok(AnalysisResult)
}
}
fn main() {
let processor = DataProcessor;
let result = processor
.load_data()
.map_err(|e| {
log::error!("Load data error: {:?}", e);
e
})
.and_then(|data| processor.parse_data(data).map_err(|e| {
log::error!("Parse data error: {:?}", e);
e
}))
.and_then(|model| processor.analyze_data(model).map_err(|e| {
log::error!("Analyze data error: {:?}", e);
e
}));
match result {
Ok(result) => println!("Analysis result: {:?}", result),
Err(_) => (),
}
}
在上述代码中:
- 错误类型定义:定义了
DataLoadError
、DataParseError
和DataAnalysisError
,并实现了Debug
、Display
和Error
trait。 - 数据模型定义:定义了
DataModel
和AnalysisResult
。 - 结构体及方法:定义了
DataProcessor
结构体,并实现了load_data
、parse_data
和analyze_data
方法。 - 调用链:在
main
函数中,使用map_err
和and_then
方法组成调用链,在出现错误时记录详细的错误信息到日志中(这里假设log
库已正确引入和配置)。这样既保证了性能,又提高了代码的可读性。