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

【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 test
   Compiling greeter v0.1.0 (file:///projects/greeter)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.91s
     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)

running 1 test
test tests::greeting_contains_name ... FAILED

failures:

---- 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 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.93s
     Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a)

running 1 test
test tests::greeting_contains_name ... FAILED

failures:

---- 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 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.kler.cn/a/473402.html

相关文章:

  • C语言初阶习题【25】strcpy的模拟实现
  • Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象
  • 【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
  • 创建Java项目,并添加MyBatis包和驱动包
  • 网络安全-XSS跨站脚本攻击(基础篇)
  • n 维数组(张量)关于轴 axis 的理解
  • 网络安全图谱以及溯源算法
  • Go中的context 包使用详解
  • 图像处理|膨胀操作
  • Windows系统安装Docker Desktop
  • 【踩坑】SparkSQL union/unionAll 函数的去重问题
  • JavaScript动态渲染页面爬取之Selenium
  • Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索
  • 实习总结(经历篇)
  • 聚类系列 (二)——HDBSCAN算法详解
  • GO:sync.Map
  • springboot远程链接spark
  • 力扣 34. 在排序数组中查找元素的第一个和最后一个位置
  • SpringBoot3动态切换数据源
  • 基于springboot的网上商城购物系统
  • 2025.1.8(c++对c语言的扩充——堆区空间,引用,函数)
  • Mysql面试相关
  • 使用 vue3 赋值后视图没变化的问题
  • 蓝桥杯训练
  • T-SQL语言的语法
  • 使用 SQLite3 的基本操作步骤