尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 thiserror 派生宏消除自定义错误样板代码:100-exercises-to-learn-rust 的 TicketNewError 实战
示例工程教程【免费下载链接】100-exercises-to-learn-rustA self-paced course to learn Rust, one exercise at a time.项目地址https://gitcode.com/GitHub_Trending/10/100-exercises-to-learn-rust点击查看免费下载本篇指南聚焦 Rust 生态中最常用的错误处理库之一thiserror先回顾手动实现std::error::Errortrait 时的样板代码痛点再讲解如何通过#[derive(thiserror::Error)]与#[error(...)]属性宏一键生成Display实现并结合本仓库05_ticket_v2/12_thiserror练习中的TicketNewError实战案例包含依赖声明、枚举变体设计与测试断言让读者既能读懂宏的语法也能在真实项目中立刻上手消除错误类型样板代码。痛点回顾手写Errortrait 的样板代码在100-exercises-to-learn-rust课程的 09_error_trait 一节中我们已经看到 Rust 标准库用std::error::Errortrait 统一了错误报告机制// Slightly simplified definition of the Error trait pub trait Error: Debug Display {}Error有两个 supertraitDebug和Display。想为自定义错误类型实现Error就必须同时实现这两者Debug可以通过#[derive(Debug)]自动生成面向开发者与运维人员Display面向最终用户必须手写fmt方法详见 Display 与 Debug 的区别。于是每个自定义错误类型都要重复一段几乎相同的代码一个Display的impl块加上一个空的Errorimpl 块。在 10_packages 一节的总结中作者就明确指出It took a bit of code to implement theErrortrait forTicketNewError, didnt it? A manualDisplayimplementation, plus anErrorimpl block.设想一个大型代码库里几十上百个错误类型都要这么写样板代码的负担不言而喻。而thiserror正是为了消除这部分样板而生的。thiserror是什么thiserror是一个 Rust crate它的核心能力是提供一个过程宏procedural macro在编译期替你生成错误类型的Display实现以及Error的实现从而简化自定义错误类型的创建。从仓库的 Cargo.lock 可以看出当前项目锁定的是thiserror1.0.69 版本它依赖内部的thiserror-impl过程宏实现包。也就是说本仓库中多个练习如locks、patch、rwlock、try_from等模块都在使用thiserror作为统一错误处理方案。第一步在 Cargo.toml 中声明依赖thiserror是第三方 crate使用前必须先把它加入包的依赖清单。本仓库 11_dependencies 一节讲解了标准声明方式[dependencies] thiserror 1关键点1表示最低版本为1.0.0cargo会解析出满足要求的兼容版本thiserror从 crates.ioRust 官方包注册中心拉取运行cargo build时cargo依次执行依赖解析、下载依赖、编译项目三个阶段若项目已有Cargo.lock且 manifest 未变更依赖解析会被跳过——Cargo.lock记录了所有依赖的精确版本本仓库锁定的thiserror即为 1.0.69保证多开发者、CI 环境构建一致需要升级时执行cargo update更新Cargo.lock。核心用法一行宏代替整段样板这是文档给出的最小示例直接用thiserror为带String字段的错误枚举实现Error#[derive(thiserror::Error, Debug)] enum TicketNewError { #[error({0})] TitleError(String), #[error({0})] DescriptionError(String), }逐部分拆解这段代码的语义#[derive(thiserror::Error, Debug)]thiserror::Error是一个derive宏它自动为TicketNewError生成Display实现并让该枚举满足Error: Debug Display的约束。由于Error要求类型同时实现Debug这里还需要保留Debug在 derive 列表中Debug本身由标准库提供。#[error({0})]这是thiserror自定义的属性语法为每一个变体声明Display格式化模板。{0}是格式化占位符在错误被展示时会被替换成该变体的第 0 个字段此处即String错误消息。上面的写法与 09_error_trait 中手写fmtimpl Error的代码在功能上是等价的但代码量大幅缩减且错误消息与变体定义放在一起可读性和可维护性都更好。配合更具体的枚举变体不用{0}的写法本仓库的 12_thiserror 练习源码 展示了thiserror的另一种常见形态枚举变体不带数据字段错误消息直接写在#[error(...)]字面量中。练习中的TicketNewError长这样enum TicketNewError { TitleCannotBeEmpty, TitleTooLong, DescriptionCannotBeEmpty, DescriptionTooLong, }对应地用thiserror实现Error的答案应该是#[derive(thiserror::Error, Debug)] enum TicketNewError { #[error(Title cannot be empty)] TitleCannotBeEmpty, #[error(Title cannot be longer than 50 bytes)] TitleTooLong, #[error(Description cannot be empty)] DescriptionCannotBeEmpty, #[error(Description cannot be longer than 500 bytes)] DescriptionTooLong, }这种写法的价值在于与 08_error_enums 一节的理念一脉相承——把错误情况编码进类型系统调用方可以用match精确区分每一种错误而不是去匹配脆弱的字符串。把变体从TitleError(String)细化为TitleCannotBeEmpty、TitleTooLong等具体变体正是练习注释中强调的改进方向Weve changed the enum variants to be more specific, thus removing the need for storing aStringfield into each variant.用测试验证 Display 输出该练习的单元测试直接断言to_string()的输出与#[error(...)]模板完全一致let err Ticket::new(.into(), valid_description(), Status::ToDo).unwrap_err(); assert_eq!(err.to_string(), Title cannot be empty);四条测试分别覆盖title_cannot_be_empty断言空标题错误消息为Title cannot be emptydescription_cannot_be_empty断言空描述错误消息为Description cannot be emptytitle_cannot_be_longer_than_fifty_chars断言超长标题错误消息为Title cannot be longer than 50 bytesdescription_cannot_be_too_long断言超长描述错误消息为Description cannot be longer than 500 bytes。从Ticket::new的校验逻辑lib.rs可以看到实际触发条件标题为空或超过 50 字节、描述为空或超过 500 字节时返回对应的Err变体。测试使用的valid_title()、overly_long_title()等辅助函数来自本仓库的 helpers/common按字节长度精确构造了合法与超限的输入。运行测试验证你的thiserror实现cargo test -p thiserror_thiserror_正是该练习包在 Cargo.toml 中声明的名字。深入原理过程宏与自定义语法thiserror::Error是我们在这门课程中见到的第一个第三方derive宏——此前所有derive宏如Debug、PartialEq、Clone都来自 Rust 标准库。derive宏是过程宏procedural macros的一个子集。过程宏的本质是在编译期运行一段 Rust 代码输入是你的源码如枚举定义输出是生成的新代码如Display的impl块。因此它的代码生成发生在编译时没有运行时开销它把样板代码从开发者手写变成了编译器自动生成你完全可以编写自己的过程宏——不过课程本身不深入过程宏的编写细节这属于更进阶的 Rust 主题。文档中特别强调每个过程宏都可以定义自己的语法通常在其 crate 文档中有详细说明。就thiserror而言我们只需要掌握两套语法语法作用#[derive(thiserror::Error)]派生Errortrait配合Debug满足 supertrait 约束#[error(...)]为每个变体定义Display格式化模板{0}、{1}等占位符会被替换为变体的第 0、1 个字段这种宏自带领域专用语法的设计正是过程宏强大的体现#[error(...)]让错误消息以声明式的方式与错误变体绑定既保留了手写Display的全部表达能力又消除了大量重复代码。小结何时选择 thiserror如果你的错误类型数量多、变体带数据字段或需要精细的错误消息thiserror能以最小代码量生成标准的Error实现它与ResultT, E组合使用效果最佳让Err变体类型实现Error错误信息即可直接通过to_string()/format!({}, err)报告给用户、运维或开发者在本仓库的后续练习如try_from、locks、patch等模块中thiserror被持续复用说明它是 Rust 实际项目中错误处理的常规武器。若想继续深入学习依赖管理可阅读 11_dependencies若想回顾手写Error实现的完整过程以便对比可回到 09_error_trait 与 08_error_enums 两节。赞分享示例工程教程【免费下载链接】100-exercises-to-learn-rustA self-paced course to learn Rust, one exercise at a time.项目地址https://gitcode.com/GitHub_Trending/10/100-exercises-to-learn-rust点击查看免费下载相关推荐Sokuji部署完全手册从开发到生产Electron与浏览器扩展打包指南Sokuji部署完全手册从开发到生产Electron与浏览器扩展打包指南 Sokuji是一款功能强大的实时语音翻译工具它结合了设备端AI和云端服务提供商人工智能语音本地部署桌面应用AI 应用用专用 Client 类型封装 Rust 消息传递样板代码100-exercises-to-learn-rust 并发客户端设计用专用 Client 类型封装 Rust 消息传递样板代码100 exercises to learn rust 并发客户端设计 本篇技术指南围绕 100 e示例工程教程GitHub_Trending/10/100-exercises-to-learn-rust文档即代码使用Asciidoctor的Rust项目文档管理GitHub_Trending/10/100 exercises to learn rust文档即代码使用Asciidoctor的Rust项目文档管理 你是否示例工程教程上一篇pandoc 回归测试解析GFM Pipe Table 转 RST 的 simple table 与 grid table 输出策略下一篇Sails generate 命令完全指南从脚手架生成到自定义生成器扩展创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

IDM-VTON 人体解析工具链:Detectron2 tools 目录训练、评测与可视化脚本全解析

IDM-VTON 人体解析工具链:Detectron2 tools 目录训练、评测与可视化脚本全解析

计算机视觉深度学习媒体生成 【免费下载链接】IDM-VTON [ECCV2024] IDM-VTON : Improving Diffusion Models for Authentic Virtual Try-on in the Wild 项目地址: https://gitcode.com/GitHub_Trending/id/IDM-VTON 点击查看 免费下载 导读:本文围绕 I…

📅 2026/10/3 2:31:34
基于多视觉语言模型交叉描述的智能眼镜图像理解与质量评估实战指南(OpenGlass 项目)

基于多视觉语言模型交叉描述的智能眼镜图像理解与质量评估实战指南(OpenGlass 项目)

人工智能AI 应用智能硬件本地部署可穿戴AI Agent 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 点击查看 免费下载 OpenGlass 是一个让任何普通眼镜变身 AI 智能眼镜的…

📅 2026/10/3 2:31:34
Toonflow 更新说明全解读:从 21 种语言界面到画布复制、FFmpeg 工具与桌面更新机制

Toonflow 更新说明全解读:从 21 种语言界面到画布复制、FFmpeg 工具与桌面更新机制

人工智能AI 应用AI AgentRAGAI 写作后端桌面应用 【免费下载链接】Toonflow-app Toonflow 是一款 AI 短剧漫剧工具,能够利用 AI 技术将小说自动转化为剧本,并结合 AI 生成的图片和视频,实现高效的短剧创作。借助 Toonflow,可以轻松…

📅 2026/10/3 2:31:34
MORE NEWS

更多资讯

📰

K8s集群Kubectl命令高阶运维实操

K8s集群Kubectl命令高阶运维实操技术栈:Kubernetes v1.32.13 Rocky Linux 8.6 Containerd 1.7.x操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s集群Kubectl命令高阶运维实操操作环境K8s 集群 3 节点:k8s-master(192.…

📰

从Postman到Apifox:API一站式协作与自动化测试实战指南

说实话,第一次打开 Apifox,我的第一反应是:"这不就是个换了皮肤的 Postman 吗?" 但真正用它写完一个项目的接口文档、Mock 数据、自动化测试之后,我承认当初的判断太草率了。这玩意儿本质上不是一个"调…

📰

Apifox从入门到实战:接口调试、Mock与自动化测试全攻略

1. 从工具链割裂说起:Apifox到底在解决什么问题只要做过接口开发或者接口测试,大概都经历过一段“工具满天飞”的日子:用 Postman 调接口、用 Swagger 看文档、用 Jenkins 跑自动化、用 RAP 或者 YApi 做 Mock,每个环节都挺好用&a…

📰

分布式锁选型指南:Redis、ZooKeeper与数据库方案全解析

1. 从一次订单超卖事故说起先聊一个我踩过的真实事故:线上商城做秒杀活动,活动刚开始两分钟,后台告警短信就炸了——库存扣成了负数。当时我们的订单服务有两台机器在跑,扣减库存的逻辑是先查库存、再update数据库。两台机器同时读…

📰

分布式锁选型指南:Redis、ZooKeeper与数据库锁方案实战对比

做分布式系统最绕不开的一个基础组件,就是分布式锁。我见过不少团队在并发量上来之后,才发现本地锁根本管不住多实例同时抢资源的问题,于是匆忙在 Redis、ZooKeeper、数据库这三个方案里选一个落地。结果选型时只看了一篇表面文章&#xff0c…

📰

提示工程+LoRA微调:让大模型生成可直接进CI的Java单元测试

1. 项目概述1.1 为什么想做这个项目说实话,让大语言模型帮你写单元测试用例这件事,听起来很爽,但真正做起来全是细节。我在维护一个中大型Java服务时,每天最烦的就是写那些重复的测试代码:构造函数塞参数、Mock依赖、断…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬