尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【Rust自学】11.4. 用should_panic检查恐慌

【Rust自学】11.4. 用should_panic检查恐慌
📅 发布时间:2026/7/23 18:56:14

11.4 用should_panic检查恐慌

11.4.1. 验证错误处理的情况

除了验证代码是否返回正确的值,测试还需要验证代码是否如预期处理了错误情况。例如,可以编写一个测试来验证代码是否在特定条件下发生恐慌。

这类测试需要额外的should_panic属性。用它标记的函数,如果函数内发生了恐慌,测试就通过;否则就失败。

看个例子:

pub struct Guess { value: i32, } impl Guess { pub fn new(value: i32) -> Guess { if value < 1 || value > 100 { panic!("Guess value must be between 1 and 100, got {value}."); } Guess { value } } } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic] fn greater_than_100() { Guess::new(200); } }
  • 结构体Guess有一个类型为i32的字段value。它提供关联函数new用于创建Guess实例,但前提是传给new的参数在1到100之间;否则就会恐慌。
  • greater_than_100测试函数给new传入大于100的值。这时应该发生恐慌,所以给这个测试函数加了should_panic属性,也就是写#[should_panic]。

测试结果:

$ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.12s Running unittests src/lib.rs (target/debug/deps/guessing_game-bdc6b9a45c563cc0) running 1 test test tests::greater_than_100 - should panic ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests guessing_game running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

现在故意引入一个bug,把new里的value > 100检查去掉:

pub struct Guess { value: i32, } impl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!("Guess value must be between 1 and 100, got {value}."); } Guess { value } } } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic] fn greater_than_100() { Guess::new(200); } }

这时测试函数中的Guess::new(200);不会恐慌。但因为函数加了should_panic标记,本应恐慌却没有恐慌的测试就会失败:

$ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.09s Running unittests src/lib.rs (target/debug/deps/guessing_game-bdc6b9a45c563cc0) running 1 test test tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ---- note: test did not panic as expected at src/lib.rs:21:8 failures: tests::greater_than_100 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`

11.4.2. 让should_panic更精确

有时使用should_panic的测试会有点含糊,因为它们只能说明代码是否发生了恐慌,即使这个恐慌并不是程序员预期的那个。

为了让测试更精确,可以为should_panic添加一个可选的expected参数。这样程序就会检查失败消息中是否包含指定的文字。

看个例子:

pub struct Guess { value: i32, } impl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!( "Guess value must be greater than or equal to 1, got {value}." ); } else if value > 100 { panic!( "Guess value must be less than or equal to 100, got {value}." ); } Guess { value } } } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic(expected = "less than or equal to 100")] fn greater_than_100() { Guess::new(200); } }
  • 上面的结构体稍作了修改:new里value < 1和value > 100的情况现在使用两条不同的恐慌信息。
  • 给should_panic添加了expected参数,=后面的文字就是期待的错误信息。只有函数发生了恐慌,并且恐慌信息包含期待的文字,测试才通过;否则就失败。

这个程序肯定能通过。

用同样的套路手动引入错误。例如,把new里小于1和大于100时的恐慌信息交换一下:

pub struct Guess { value: i32, } impl Guess { pub fn new(value: i32) -> Guess { if value < 1 { panic!( "Guess value must be less than or equal to 100, got {value}." ); } else if value > 100 { panic!( "Guess value must be greater than or equal to 1, got {value}." ); } Guess { value } } } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic(expected = "less than or equal to 100")] fn greater_than_100() { Guess::new(200); } }

测试结果:

$ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished `test` profile [unoptimized + debuginfo] target(s) in 0.08s Running unittests src/lib.rs (target/debug/deps/guessing_game-bdc6b9a45c563cc0) running 1 test test tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ---- thread 'tests::greater_than_100' (457156) panicked at src/lib.rs:12:13: Guess value must be greater than or equal to 1, got 200. note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace note: panic did not contain expected string panic message: "Guess value must be greater than or equal to 1, got 200." expected substring: "less than or equal to 100" failures: tests::greater_than_100 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`

失败信息表明测试确实发生了恐慌,但恐慌消息没有包含期待的字符串less than or equal to 100。在这种情况下,我们实际收到的恐慌信息是Guess value must be greater than or equal to 1, got 200.。根据这些信息就足以修复这个bug。

相关新闻

  • 基于ddddocr与Hu矩的验证码识别技术实践
  • 杭州 2026 旧腕表回收避坑,正规门店交易细节拆解 - 每日生活报
  • 收藏!10个企业级AI高频应用场景,小白也能轻松落地实践

最新新闻

  • AI Agent自动化工作流设计:企业智能助手如何落地
  • AI办公不是替代人,而是淘汰不会用AI的人:3类岗位正在消失,4类新角色年薪涨62%
  • 嵌入式系统参数动态更新利器:TI MCU POM模块原理与实战
  • 上海管道疏通避坑指南 虹口区快达师傅上门快不坑(2026年7月) - 余生黄金回收
  • 强强联合,共拓数字化新蓝海|河南花仙子网络与金正集团(经营帮)达成战略合作
  • GEE中的几个小技巧

日新闻

  • 亨得利盐城维修点在哪里?手表维修保养地址指南**公示(2026年7月最新) - 亨得利官方
  • 提升.NET API安全性:Boxed.AspNetCore.Swagger认证授权最佳实践
  • 帝舵佛山**网点地址更新:2026年7月售后热线电话与服务客户指南 - 帝舵中国官方服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号