news 2026/4/28 10:38:00

【time-rs】解释://! Error that occurred at some stage of parsing(error/parse.rs)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【time-rs】解释://! Error that occurred at some stage of parsing(error/parse.rs)

这段Rust代码定义了一个解析错误的通用枚举类型Parse,用于表示在时间解析过程中可能发生的各种错误。它是时间解析库中的核心错误类型。

枚举定义

#[non_exhaustive]#[allow(variant_size_differences, reason ="only triggers on some platforms")]#[derive(Debug, Clone, Copy, PartialEq, Eq)]pubenumParse{TryFromParsed(TryFromParsed),ParseFromDescription(ParseFromDescription),#[non_exhaustive]#[deprecated( since ="0.3.28", note ="no longer output. moved to the `ParseFromDescription` variant")]UnexpectedTrailingCharacters{#[doc(hidden)]never:Infallible,},}

属性说明:

  1. #[non_exhaustive]

    • 表示枚举未来可能添加新变体
    • 强制用户代码使用穷尽匹配,保持向后兼容
  2. #[allow(variant_size_differences)]

    • 允许变体大小不同(因为包含Infallible类型)
    • reason属性说明:仅在某些平台上触发
  3. #[derive(...)]

    • 实现了DebugCloneCopyPartialEqEq等常见trait

变体详解

1.TryFromParsed(TryFromParsed)

  • 表示在从解析结果转换到目标类型时发生的错误
  • 例如:解析出的日期时间值超出目标类型的有效范围

2.ParseFromDescription(ParseFromDescription)

  • 表示根据格式描述进行解析时发生的错误
  • 例如:输入字符串与格式描述不匹配

3.UnexpectedTrailingCharacters(已弃用)

#[deprecated(since ="0.3.28", note ="...")]UnexpectedTrailingCharacters{#[doc(hidden)]never:Infallible,}
  • 已弃用:从 0.3.28 版本开始不再使用
  • 迁移:功能已移至ParseFromDescription变体
  • Infallible:永不实例化的类型,确保该变体无法构造
  • 设计目的:保持API兼容性,同时逐步移除旧功能

Display trait 实现

implfmt::DisplayforParse{fnfmt(&self,f:&mutfmt::Formatter<'_>)->fmt::Result{matchself{Self::TryFromParsed(err)=>err.fmt(f),Self::ParseFromDescription(err)=>err.fmt(f),#[allow(deprecated)]Self::UnexpectedTrailingCharacters{never}=>match*never{},}}}

实现特点

  • 委托给内部错误的Display实现
  • 对于已弃用变体,使用match *never {}保证编译通过
  • #[allow(deprecated)]允许使用已弃用的变体模式

Error trait 实现

implcore::error::ErrorforParse{fnsource(&self)->Option<&(dyncore::error::Error+'static)>{matchself{Self::TryFromParsed(err)=>Some(err),Self::ParseFromDescription(err)=>Some(err),#[allow(deprecated)]Self::UnexpectedTrailingCharacters{never}=>match*never{},}}}

特点

  • 实现source()方法,提供错误的根本原因
  • 支持错误链(error chain)
  • 同样处理了已弃用变体

与内部错误类型的转换

TryFromParsed转换到Parse

implFrom<TryFromParsed>forParse{fnfrom(err:TryFromParsed)->Self{Self::TryFromParsed(err)}}

Parse尝试转换到TryFromParsed

implTryFrom<Parse>forTryFromParsed{typeError=error::DifferentVariant;fntry_from(err:Parse)->Result<Self,Self::Error>{matcherr{Parse::TryFromParsed(err)=>Ok(err),_=>Err(error::DifferentVariant),}}}

ParseFromDescription转换到Parse

implFrom<ParseFromDescription>forParse{fnfrom(err:ParseFromDescription)->Self{Self::ParseFromDescription(err)}}

Parse尝试转换到ParseFromDescription

implTryFrom<Parse>forParseFromDescription{typeError=error::DifferentVariant;fntry_from(err:Parse)->Result<Self,Self::Error>{matcherr{Parse::ParseFromDescription(err)=>Ok(err),_=>Err(error::DifferentVariant),}}}

转换模式总结

  • From<T>:总是成功,向上转换
  • TryFrom<Parse>:可能失败,向下转换
  • DifferentVariant:当错误类型不匹配时返回

与 crate::Error 的转换

向上转换:Parsecrate::Error

implFrom<Parse>forcrate::Error{fnfrom(err:Parse)->Self{matcherr{Parse::TryFromParsed(err)=>Self::TryFromParsed(err),Parse::ParseFromDescription(err)=>Self::ParseFromDescription(err),#[allow(deprecated)]Parse::UnexpectedTrailingCharacters{never}=>matchnever{},}}}

处理已弃用变体

  • 对于UnexpectedTrailingCharacters,使用match never {}保证不会执行
  • 确保编译通过,即使变体已弃用

向下转换:crate::ErrorParse

implTryFrom<crate::Error>forParse{typeError=error::DifferentVariant;fntry_from(err:crate::Error)->Result<Self,Self::Error>{matcherr{crate::Error::ParseFromDescription(err)=>Ok(Self::ParseFromDescription(err)),#[allow(deprecated)]crate::Error::UnexpectedTrailingCharacters{never}=>matchnever{},crate::Error::TryFromParsed(err)=>Ok(Self::TryFromParsed(err)),_=>Err(error::DifferentVariant),}}}

使用场景示例

解析时间字符串

usetime::format_description;usetime::parsing::Parse;fnparse_datetime(input:&str)->Result<OffsetDateTime,Parse>{letformat=format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second]")?;letparsed=PrimitiveDateTime::parse(input,&format)?;Ok(parsed.into())}

错误处理

matchparse_datetime("2023-13-01 25:00:00"){Ok(dt)=>println!("解析成功: {}",dt),Err(Parse::ParseFromDescription(err))=>{eprintln!("格式解析错误: {}",err);}Err(Parse::TryFromParsed(err))=>{eprintln!("类型转换错误: {}",err);}}

设计特点

1. 分层错误处理

crate::Error ├── Parse │ ├── TryFromParsed │ └── ParseFromDescription └── Other errors...

2. 向后兼容性

  • 使用#[deprecated]Infallible平滑过渡
  • #[non_exhaustive]保护未来扩展

3. 类型安全

  • 双向转换确保类型安全
  • 使用TryFrom进行安全的错误类型提取

4. 性能优化

  • #[inline]提示内联优化
  • 大部分类型实现Copy,减少分配

与其他错误类型的关系

错误类型层级用途
crate::Error顶级所有错误的容器
Parse中间层解析相关错误
TryFromParsed具体层转换错误
ParseFromDescription具体层格式解析错误

这种设计提供了灵活的错误处理机制,既支持通用的错误处理,也支持精确的错误类型匹配。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:39:07

可能是你极易忽略的Nginx知识点

点击上方 程序员成长指北&#xff0c;关注公众号回复1&#xff0c;加入高级Node交流群下面是我在nginx使用过程中发现的几个问题&#xff0c;分享出来大家一起熟悉一下nginx问题一先看下面的几个配置# 配置一 location /test {proxy_pass http://192.186.0.1:8080; }# 配置二 l…

作者头像 李华
网站建设 2026/4/26 23:35:47

答辩PPT不再头疼:百考通AI智能结构优化与内容提炼指南

“我的论文有六十页&#xff0c;答辩PPT到底该放什么、不放什么&#xff1f;”这是很多毕业生在制作答辩PPT时的真实困惑。内容取舍困难、逻辑主线模糊&#xff0c;成为答辩准备中的“隐形门槛”。今天我们就来深入聊聊&#xff0c;如何借助百考通AI的智能功能&#xff0c;科学…

作者头像 李华
网站建设 2026/4/26 3:13:58

【Rust日报】 LWN《Rust 内核实验的情况》

LWN《Rust 内核实验的情况》文章报道了在 2025 年 Linux 内核维护者峰会&#xff08;Linux Kernel Maintainers Summit&#xff09; 上的一场关于 Rust 语言在内核中地位的关键讨论。1. 核心结论&#xff1a;实验宣告成功背景&#xff1a; 当 Rust 最初被引入 Linux 内核&#…

作者头像 李华
网站建设 2026/4/23 15:24:12

百考通源码图库:您的项目开发加速器,海量优质资源触手可及!

在当今快节奏的数字化时代&#xff0c;无论是高校学子完成课程设计、毕业论文&#xff0c;还是企业开发者快速搭建原型、验证技术方案&#xff0c;一个高效、可靠的代码资源库都是不可或缺的宝贵资产。面对纷繁复杂的开源世界和海量的零散代码片段&#xff0c;如何精准定位、高…

作者头像 李华
网站建设 2026/4/27 17:36:05

最新Quasar 指南7:9527字带你了解Quasar 安全开发规范(Do’s and Don’ts)核心总结 - Quasar 完全教程:从基础到实战 --Ryan

密码学 不要创建自己的加密解决方案不要以明文形式存储个人信息不要创建自己的加密解决方案 &#xff08;故意重复&#xff09;不要忽略实施细节的任何方面不要创建自己的加密解决方案 &#xff08;故意重复&#xff09;不要使用MD5或SHA1不要创建自己的加密解决方案 Quasar …

作者头像 李华
网站建设 2026/4/20 3:15:18

物联网平台二开

物联网平台 - Thinglinks-iot ## &#x1f31f; 项目简介 一个功能完备、高可扩展的物联网平台&#xff0c;提供完整的设备接入、管理和数据处理解决方案。支持多种网络协议&#xff0c;具备强大的消息解析和实时告警能力&#xff0c;帮助企业快速构建物联网应用。 该项目现已纳…

作者头像 李华