【Rust自学】11.4. 用should_panic检查恐慌
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 --lib11.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_BACKTRACE1 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。

相关新闻

高效办公 AI 智能体搭建,OpenClaw 整合包极简部署方案(含安装包)

高效办公 AI 智能体搭建,OpenClaw 整合包极简部署方案(含安装包)

零基础搭建桌面自动化 AI|OpenClaw v2.7.9 双端整合包部署教程 适配系统:Windows10/11 64 位、macOS 12 及以上 当前版本:v2.7.9(虾壳云稳定整合版) 核心特点 采用全新轻量化封装方案,整套部署无需代码操…

2026/7/23 18:53:03阅读更多 →
【爱马仕】新手友好|Hermes Agent 轻量化部署方案,轻松搭建桌面数字助手(含安装包)

【爱马仕】新手友好|Hermes Agent 轻量化部署方案,轻松搭建桌面数字助手(含安装包)

Windows 快速搭建 Hermes 本地智能 Agent|预整合资源包简化环境配置流程 资源获取地址 Windows 部署包:https://hm.ikidi.top/api/download/package/55?promoCodeIV644F14DA00 前言 Hermes Agent 作为可以操控电脑执行各类任务的桌面本地智能体&…

2026/7/23 18:53:03阅读更多 →
技术落地复盘:物联网智能锁如何解决网约房民宿合规安防与高运维成本痛点

技术落地复盘:物联网智能锁如何解决网约房民宿合规安防与高运维成本痛点

摘要 随着国内网约房、分散式民宿行业监管体系日趋完善,公安“实名、实人、实证、实时”四实登记制度成为行业刚性合规底线。区别于传统集中式酒店,分散式短租房源存在房源点位分散、租客流动性强、无固定前台值守、人工管控难度大等行业痛点。传统人工登…

2026/7/23 18:53:03阅读更多 →
【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

题目 攻防世界-WEB-PHP2 https://adworld.xctf.org.cn/challenges/list 解题 访问网址 http://61.147.171.105:64825/index.phps admin.split().map(c > % c.charCodeAt(0).toString(16).toUpperCase()).join()%61%64%6D%69%6E%61%64%6D%69%6E.split().map(c > % …

2026/7/23 19:59:27阅读更多 →
告别低效记录!免费又好用的语音转文字软件深度评测,准确率高达98.7%

告别低效记录!免费又好用的语音转文字软件深度评测,准确率高达98.7%

你是否也曾在冗长的会议后,面对堆积如山的录音文件感到头疼?是否在学生时代,为了一字不差地记下老师的板书和口述而手忙脚乱?又或者,作为一名内容创作者,需要将大量的视频、音频采访素材快速转化为文字&…

2026/7/23 19:59:27阅读更多 →
【CTF-MISC-压缩包】脚本实现批量提取压缩包数据

【CTF-MISC-压缩包】脚本实现批量提取压缩包数据

题目 2024年春秋杯网络安全联赛冬季赛 - MISC - 压力大,写个脚本吧 https://www.ichunqiu.com/battalion?t1&r78931 解题思路 打开文件 发现一个压缩包一个txt文件 txt里有一串密文 RkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZH…

2026/7/23 19:59:27阅读更多 →
AI电商头花主图生成:Stable Diffusion商业实践

AI电商头花主图生成:Stable Diffusion商业实践

1. 项目背景与核心价值这个头花产品商业化做图项目源于一个很实际的需求:如何在电商平台上用最低成本批量生成高质量产品展示图。作为从业十年的电商视觉设计师,我深知中小商家在商品主图制作上的痛点——请专业摄影师拍摄成本高,自己拍又难以…

2026/7/23 19:59:27阅读更多 →
[具身智能-629]:从单人闭环到五人协同:云端GPU与边缘专用芯片AI开发的本质鸿沟

[具身智能-629]:从单人闭环到五人协同:云端GPU与边缘专用芯片AI开发的本质鸿沟

很多AI开发者都有一个直观困惑:为什么在电脑、云端随便就能跑通的模型,移植到边缘嵌入式芯片后,bug层出不穷、精度断崖下跌、帧率死活不达标?核心答案并非算力差距,而是两套完全不同的AI工程体系、两种截然不同的研发模…

2026/7/23 19:59:27阅读更多 →
RAG(03)——高质量文本分块

RAG(03)——高质量文本分块

为什么你的RAG效果不佳? 核心痛点 LLM强大,Prompt精心调校,但答案仍不准确检索算法和Embedding已优化,却忽略分块(Chunking) 关键结论 “不恰当的分块给模型喂’坏数据”分块质量决定RAG性能的下限 分块的本质 分块的必要性 LM上下文长度限制-向量检索对语义完整性的…

2026/7/23 19:57:21阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →