Rust错误类型处理完全指南
2025-04-30
Rust 错误类型处理理解指南
✅ 情况一:未加 chrono::ParseError 到枚举,直接用 ?(编译失败)
use thiserror::Error;
use chrono::NaiveDateTime;
#[derive(Error, Debug)]
pub enum MyError {
#[error("API 错误: {0}")]
ApiError(String),
}
fn parse_time_fail() -> Result<(), MyError> {
let _dt = NaiveDateTime::parse_from_str("invalid", "%Y-%m-%d %H:%M:%S")?; // ❌ 编译失败
Ok(())
}
❗ 编译错误:the trait From<chrono::ParseError> is not implemented for MyError
✅ 情况二:手动 .map_err(...) 包装
fn parse_time_manual() -> Result<(), MyError> {
let _dt = NaiveDateTime::parse_from_str("invalid", "%Y-%m-%d %H:%M:%S")
.map_err(|e| MyError::ApiError(format!("解析时间失败: {}", e)))?;
Ok(())
}
✅ 情况三:在枚举里添加 #[from] 实现支持
#[derive(Error, Debug)]
pub enum MyError {
#[error("API 错误: {0}")]
ApiError(String),
#[error("时间解析错误: {0}")]
ChronoError(#[from] chrono::ParseError),
}
fn parse_time_auto() -> Result<(), MyError> {
let _dt = NaiveDateTime::parse_from_str("invalid", "%Y-%m-%d %H:%M:%S")?;
Ok(())
}
✅ 总结
写法 是否支持 ? 说明 ——————————- ———— ————————————– 没写到枚举里 ❌ Rust 不知道怎么转成你的 MyError 类型 手动 .map_err(...) ✅ 自己控制怎么封装 用 #[from] 实现自动转换支持 ✅ 支持 ?,不写 .map_err 也能转