首页 > 其他分享 >【Rust自学】11.3. 自定义错误信息

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

时间:2025-01-08 11:32:33浏览次数:3  
标签:tests name 自定义 contains greeting 11.3 result test Rust

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
请添加图片描述

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`

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

标签:tests,name,自定义,contains,greeting,11.3,result,test,Rust
From: https://blog.csdn.net/weixin_71793197/article/details/144998661

相关文章

  • 【Rust自学】11.4. 用should_panic检查恐慌
    喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)11.4.1.验证错误处理的情况测试函数出了验证代码的返回值是否正确,还需要验证代码是否如预期的去处理了发生错误的情况。比如说可以编写一个测试来验证代码是否在特......
  • 【Java】自定义字符串方法——根据开始和结束字符串,截取字符串
    1/**2*根据开始和结束字符串,截取字符串3*@paramstr被截取的字符串4*@paramstartStr起始字符串(最后一次出现的起始值)5*@paramendStr结束字符串(最后一次出现的结束值)6*@return7*/8publicstaticStringsubstring(Stringstr,Stringstar......
  • 假如你想自定义一个网络协议
    一、引言在当今数字化时代,网络通信无处不在。虽然现有的TCP/IP协议簇已广泛应用且极为成熟,但在某些特定场景下,如工业控制网络、科研专用网络、对安全性和性能有特殊要求的军事通信等领域,自定义网络协议具有独特优势。它能够根据具体需求精细优化网络性能、强化安全保障、适......
  • zabbix5.0版本 (用脚本自定义监控项+监控MySQL状态信息)
    目录1.用脚本自定义监控项(1)编写脚本进行取值(2)修改zabbix客户端配置文件(3)zabbix创建模板及监控项(4)关联至被监控主机2.监控MySQl状态信息(1)使用脚本定义监控项(2)服务端创建MySQL监控模板(3)添加触发器(4)配置图形(5)关联至被监控主机(6)测试并查看数据3.自定义监控项以及监控......
  • 【Rust】从 Node.js 开发者的视角深入理解 Rust 的所有权与借用机制
    Rust的所有权(Ownership)与借用(Borrowing)机制是其区别于其他编程语言的核心特性,也是保障内存安全的重要基石。在本文中,我们将从熟悉Node.js的开发者视角出发,探讨Rust如何通过这些独特的设计实现高效可靠的内存管理,并对比JavaScript的垃圾回收机制,帮助您更容易理解这些概念。......
  • 2024.11.31
    HTML5 Video(视频)很多站点都会使用到视频.HTML5提供了展示视频的标准。检测您的浏览器是否支持HTML5视频:检测Web站点上的视频直到现在,仍然不存在一项旨在网页上显示视频的标准。今天,大多数视频是通过插件(比如Flash)来显示的。然而,并非所有浏览器都拥有同样的插......
  • 2024.11.30
    getCurrentPosition()方法-返回数据T若成功,则getCurrentPosition()方法返回对象。始终会返回latitude、longitude以及accuracy属性。如果可用,则会返回其他下面的属性。属性描述coords.latitude十进制数的纬度coords.longitude十进制数的经度coords.accurac......
  • rust学习十五.5、引用循环和内存泄露
    这个章节主要是为了引出弱引用这个奇怪的概念。说实在,这个没有什么太好写的,因为内容比较晦涩难懂! 在其它语言中,也常常存在所谓循环引用问题,和大部分问题一样,在其它语言中这些基本上都不是问题。但是在rust中,这是一个致命的问题。 例如有a,b两个点,a指向b,b指向a。如果根据截......
  • Python如何读取 同花顺自选股?同花顺自选股保存在哪里?自定义板块的股票又保存在哪里?
    背景问题:客户策略想直接读取到同花顺的自选股,省得每次手动导出股票池,Python能够做到吗?回答:当然可以了!最主要的是找到同花顺自选股保存在本地的文件,找到了文件,就能通过Python来读取股票池。步骤那同花顺自选股保存在哪里呢?1、找到安装目录首先打开同花顺的安装目录,不知......
  • Vue组件及其自定义事件
    组件组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树: 标题注册一个全局组件语法格式如下:Vue.component(tagN......