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

【Rust自学】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 testCompiling greeter v0.1.0 (file:///projects/greeter)Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91sRunning unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)running 1 test
test tests::greeting_contains_name ... FAILEDfailures:---- tests::greeting_contains_name stdout ----
thread 'tests::greeting_contains_name' panicked at src/lib.rs:12:9:
assertion failed: result.contains("Carol")
note: run with `RUST_BACKTRACE=1` environment variable to display a backtracefailures:tests::greeting_contains_nametest result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00serror: 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 testCompiling greeter v0.1.0 (file:///projects/greeter)Finished `test` profile [unoptimized + debuginfo] target(s) in 0.93sRunning unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)running 1 test
test tests::greeting_contains_name ... FAILEDfailures:---- tests::greeting_contains_name stdout ----
thread 'tests::greeting_contains_name' 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 backtracefailures:tests::greeting_contains_nametest result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00serror: test failed, to rerun pass `--lib`

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

http://www.lryc.cn/news/517689.html

相关文章:

  • 05、Docker学习,常用安装:Mysql、Redis、Nginx、Nacos
  • RabbitMQ高级篇之MQ可靠性 数据持久化
  • leetcode 2274. 不含特殊楼层的最大连续楼层数 中等
  • Tauri教程-基础篇-第二节 Tauri的核心概念上篇
  • 大风车excel:怎么把题库导入excel?题库导入excel
  • Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息
  • 电脑硬盘系统迁移及问题处理
  • 网关 + Nacos配置管理
  • 《Spring Framework实战》6:核心技术 4.1.IoC 容器
  • ModuleNotFoundError: No module named ‘audioop‘
  • STM32-笔记38-I2C-oled实验
  • 人大金仓实现主键自增.
  • h264之多视点mvc编码及解码过程(JMVC平台举例)
  • 小程序学习08—— 系统参数获取和navBar组件样式动态设置
  • 数据库环境安装(day1)
  • 网络安全-web渗透环境搭建-BWAPP(基础篇)
  • 当算法遇到线性代数(三):实对称矩阵
  • WayLand的架构和协议
  • STM32学习(十)
  • 进阶篇-Day17:JAVA的日志、枚举、类加载器、反射等介绍】
  • Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解
  • C++和Python中负数取余结果的区别
  • rust学习——环境搭建
  • Linux系统中解决端口占用问题
  • 现代软件架构设计:14个质量属性的定义、权衡与最佳实践
  • 【UE5 C++课程系列笔记】25——多线程基础——FGraphEventRef的简单使用
  • 计算机网络之---信号与编码
  • linux下用命令行给串口写数据和读数据
  • 【生物信息】如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组
  • 纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)