当前位置: 首页 > news >正文

【Rust自学】11.3. 自定义错误信息

11.3 自定义错误信息

11.3.1. 添加错误信息

在 11.2. 断言(Assert) 中我们学习了assert!assert_eq!assert_ne!这三个宏,而这篇文章讲的是它们的进阶用法。

这三个宏可以接收自定义错误信息,但这是可选项。如果添加了自定义信息,它们会和标准的失败信息一起打印出来:
- 对于assert!,第一个参数是必填的,自定义信息作为第二个参数。
- 对于assert_eq!assert_ne!,前两个参数是必填的,自定义信息作为第三个参数。

把自定义信息传进去之后,它会被传给format!宏来构建字符串。由于format!可以使用{}占位符,所以传进去的信息也可以使用占位符。

看个例子:

pub fn greeting(name: &str) -> String { format!("Hello {name}!") } #[cfg(test)] mod tests { use super::*; #[test] fn greeting_contains_name() { let result = greeting("Carol"); assert!(result.contains("Carol")); } }
  • greeting接收一个名为name的字符串切片参数,并返回由Helloname!拼接而成的字符串。
  • greeting_contains_name测试函数先把greeting("Carol")的返回值赋给result,然后在result上调用contains方法,检查result是否包含"Carol"

这段代码现在可以通过测试。

现在手动引入一个bug,修改greeting函数:

pub fn greeting(name: &str) -> String { format!("Hello!") } #[cfg(test)] mod tests { use super::*; #[test] fn greeting_contains_name() { let result = greeting("Carol"); assert!(result.contains("Carol")); } }

这样测试会失败:

$ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.14s Running unittests src/lib.rs (target/debug/deps/greeter-647141eed08f233c) running 1 test test tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ---- thread 'tests::greeting_contains_name' (455732) panicked at src/lib.rs:12:9: assertion failed: result.contains("Carol") note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib`

不过失败信息只说在第12行第9列发生了恐慌,并没有提供更友好、更有用的信息。怎么办呢?添加自定义信息:

pub fn greeting(name: &str) -> String { format!("Hello!") } #[cfg(test)] mod tests { use super::*; #[test] fn greeting_contains_name() { let result = greeting("Carol"); assert!( result.contains("Carol"), "Greeting did not contain name, value was `{result}`" ); } }

输出:

$ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.09s Running unittests src/lib.rs (target/debug/deps/greeter-647141eed08f233c) running 1 test test tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ---- thread 'tests::greeting_contains_name' (456094) panicked at src/lib.rs:12:9: Greeting did not contain name, value was `Hello!` note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--lib`

可以看到,自定义信息出现在了错误输出里。这样的信息更有实际意义,也更容易找出错误原因。

http://www.jsqmd.com/news/1249457/

相关文章:

  • 2026肠胃弱猫咪羊奶粉深度横评:5项指标实测+5款主流产品对比,玻璃胃养猫避坑指南
  • ChatGPT、Codex 与 Legacy Code:AI 是老系统的救星,还是压垮它的最后一根稻草?(Plus/Pro 实战观察)
  • DMA裸板驱动使用说明
  • 【Rust自学】6.4. 简单的控制流-if let
  • 小米路由器刷入Breed与OpenWrt详细流程并实现远程管理本地软路由
  • 济南上门回收手表靠谱吗?上门交易风险盘点 - 好物测评局
  • 2026淮南煤矿/电厂职工注意!国开大专采矿/电气自动化专业,助力职称评定! - 我叫小周
  • ARM架构下安装新版docker及docker-compose
  • 2026内蒙古中考落榜别灰心!电大中专保留学籍,曲线救国圆你大学梦! - 我叫小周
  • 宁波实体黄金回收店|大盘价当场结算 - 大牌深度测评
  • 2026高钙猫咪羊奶粉品牌实测横评:5维度实测,附避坑指南+选型方案
  • 大模型推理加速技术:ATB架构与优化实践
  • Nginx 负载均衡和反向代理
  • 深入解析MCU的IOMM:寄存器映射、引脚复用与错误处理实战
  • 2026 欧米茄海马闲置在家贬值?青岛合扬全城实体网点,评估完毕即刻回款! - 好物测评局
  • 每天节省2.7小时!AI自动发邮件的12种高价值场景(销售跟进、客户回访、内部通知全覆盖)
  • 2026年全国混凝土色差修复新标准:3步实现永久无痕
  • Django毕设选题推荐:基于 Django社区防疫数据监测与信息公示系统设计 面向社区的疫情人员信息登记管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026年武汉东湖光电职业技术学校报考指南 - 湖北找学校
  • 2026年昆仑广州特约售后点位资料归档丨天河城写字楼维保服务中心区位一览 - 昆仑中国售后中心
  • 瑞士进口测表仪精准检测!石家庄合扬机芯状态一目了然 - 日常财经早知道
  • 【Rust自学】5.3. struct的方法(Method)
  • Django毕业设计-基于 Django 的物资仓储与配送管理系统设计与实现 智能物资配送调度管理平台的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026 年 7 月新发布:内蒙古可靠的古建牌楼工程制造商哪家专业,揭秘:牌楼的千年工艺,如何重塑现代都市面貌? - 行业甄选官
  • 深入解析C2000 eQEP模块:正交编码器硬件解码与高精度运动控制
  • WSL2配置tensorflow GPU环境
  • 为什么有的人偏爱 Mac?
  • GEO优化为什么不能只发软文?广拓时代谈AI搜索内容资产建设
  • 南京高端首饰回收哪家不坑?2026 新手出手品牌首饰防套路安全变现指南 - 全国二奢机构参考
  • 如何在OpenWrt软路由中增加一个新功能