// 定义错误摘要的数据结构
#[derive(Debug)]
struct ErrorSummary {
error_types: std::collections::HashMap<String, Vec<String>>,
}
// 公共函数,接受可变数量的错误参数
pub fn classify_errors(errors: Vec<Box<dyn std::error::Error>>) -> ErrorSummary {
let mut summary = ErrorSummary {
error_types: std::collections::HashMap::new(),
};
for err in errors {
let error_type = std::any::type_name::<dyn std::error::Error>(&*err);
let error_message = err.to_string();
summary.error_types.entry(error_type.to_string()).or_insert_with(Vec::new).push(error_message);
}
summary
}
// 测试用例
#[cfg(test)]
mod tests {
use super::*;
use std::error::Error;
#[test]
fn test_classify_errors() {
let err1 = Box::<dyn Error>(Box::new(std::io::Error::new(std::io::ErrorKind::NotFound, "file not found")));
let err2 = Box::<dyn Error>(Box::new(std::num::ParseIntError));
let err3 = Box::<dyn Error>(Box::new(std::io::Error::new(std::io::ErrorKind::PermissionDenied, "permission denied")));
let summary = classify_errors(vec![err1, err2, err3]);
assert_eq!(summary.error_types.len(), 2);
assert!(summary.error_types.contains_key("std::io::Error"));
assert!(summary.error_types.contains_key("std::num::ParseIntError"));
}
}