18|错误处理系统:错误的构建、传递和处理
错误的分类
不可恢复型错误
可恢复型错误
- 深入了解
- 翻译
- 解释
- 总结
Rust语言中的错误处理系统是一个重要且系统性的工作。本文从错误的分类、错误相关的基础设施、Error trait以及标准库中的错误类型等方面展开讲解。文章首先介绍了不可恢复型错误和可恢复型错误的区别,以及在Rust中对这些错误的支持设施,如panic!、todo!、unimplemented!和unreachable!等。接着详细讲解了Rust中的Result<T, E>类型及其相关的基础设施,包括错误的表示、构造、传递和处理。文章还提到了Rust中定义的抽象Error trait,以及实现Error trait的类型在Rust生态中的作用。通过具体的代码示例和错误类型的介绍,读者可以了解到Rust语言中错误处理系统的特点和使用方法。文章还介绍了错误的传递、map_err转换错误类型以及Result链式处理等内容,为读者提供了全面的错误处理知识。另外,文章还介绍了Rust中的?操作符,简化了错误处理代码,使得代码结构更加清晰。文章最后介绍了Rust中的错误处理系统最佳实践,包括错误的冒泡和具体的软件架构设计决定错误处理的层次。文章还介绍了thiserror和anyhow等优秀的crate,使Rust语言错误处理的工程体验提升了一个层次,达到了既好用又优美的状态。这两个库充分展现了Rust语言强大的表达能力,anyhow 主要通过Rust强大的类型系统实现,thiserror主要通过Rust强大的宏能力实现。文章内容丰富,对Rust语言错误处理系统进行了全面深入的介绍,对读者进行了引导和启发。
《Rust 语言从入门到实战》,新⼈⾸单¥59
全部留言(8)
- 最新
- 精选
- 下雨天请说明 anyhow::Error 与自定义枚举类型用作错误的接收时的区别。 以无穷对有穷。 1.anyhow::Error可以收拢所有你考虑到或者没考虑到的错误。 2. 自定义枚举只能收拢你想到滴可能出现错误,比如std::io::Error 自定义枚举没法直接收拢了,要处理得再转换一波。
作者回复: 真棒👍
2023-11-29归属地:湖北2 - Geek_3b58b9那究竟什么时候使用anyhow::Errror, 什么时候使用Box<dyn Error>呢?
作者回复: 基本可以互换,anyhow::Error 是一个结构体类型的,这点更方便。
2024-01-17归属地:江苏1 - A0.何文祥比如一个函数返回一个有符号整数,可以用 0 表示正常情况下的返回,用 -1 或其他负数值表示异步情况下的返回。 异步 -> 异常
作者回复: c语言里面就是这样的,但是被总结下来并不是一套好的实践
2024-01-10归属地:中国香港1 - 刘丹能否举个简单的例子,说明一下怎样把anyhow与thiserror结合起来使用?
作者回复: 后面可以写一个例子来展示。可以先来看几个实际场景中的例子:https://github.com/facebook/sapling/blob/47c8f223f24ef5359cb9216051522e23fa70130a/eden/scm/lib/clidispatch/src/errors.rs#L12 https://github.com/google/tarpc/blob/3264979993fefcaf3b7483fabd546dc5d5f15aa0/tarpc/src/client.rs#L623 https://github.com/neondatabase/neon/blob/e43cde7aba2681d8d2e703fdfdb963caccf5acd0/pageserver/src/tenant.rs#L337
2023-11-30归属地:广东3 - 鸠摩智第一次看到将thiserror、anyhow这些错误处理crate讲得这么详细的文章,干货满满
作者回复: 感谢认同。
2023-11-29归属地:江苏 - 杨赛军老师 为什么不能把result错误返回值改为 Box<dyn Error>呢?
作者回复: 可以呀,你说的哪个地方?
2023-11-29归属地:北京3 - 伯阳老师新手上来直接用这个anyhow与thiserror,不用原生的可以么,是大型系统都是统一的错误处理对吧
作者回复: 可以直接用。每个系统都不一样,有自己的设计,但是anyhow和thiserror现在用得最多
2023-11-29归属地:北京 - superggn思考题: - 请你查阅 Rust std 资料,并说说对 std::error::Error 的理解 - 有俩 trait (Debug + Display), 能打印 - 请说明 anyhow::Error 与自定义枚举类型用作错误的接收时的区别 - anyhow::Error 更通用 这节课感觉就当手册看了, 回头再往回返回, 现在看了跑了也记不住2023-12-25归属地:北京