Rust 语言从入门到实战
唐刚
Rust 语言中文社区联合创始人
5266 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Rust 语言从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

18|错误处理系统:错误的构建、传递和处理

你好,我是 Mike。今天我们一起来学习 Rust 语言中的错误表示、传递及处理相关的知识。Rust 的错误处理很重要,也很系统。所以话不多说,我们直接进入正题。

错误的分类

错误是需要分类的,不同类型的错误可能有不同的处理策略。总的来看错误分成可恢复型错误和不可恢复型错误,下面我们具体来看看这两种类型。

不可恢复型错误

有些错误,我们碰到了后需要及早退出程序,或者直接不启动程序,而是打出错误信息。
Rust 中,对这些错误的支持设施有 4 个。
panic!:让程序直接崩掉,退出程序,同时可选择是否打印出栈回溯信息。
todo!:常用于功能还未实现,执行到这里直接退出程序,并提示说这个功能处于准备做的状态。
unimplemented!:常用于功能还未实现,执行到这里直接退出程序,并提示说这个功能处于未实现的状态。
unreachable!:用于写在一些原则上不可能执行到的语句,比如一个 loop {} 死循环的后面,执行到那里的话,就表示肯定出错了,直接退出程序。

可恢复型错误

可恢复型错误指的是那一类错误,在遇到后,不应该让整个程序直接停止运行,而是在代码逻辑中分析可能的错误原因,要么尝试恢复性的处理方案,要么给用户返回自定义的错误信息,让用户明白任务未达到预期的原因。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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归属地:北京
收起评论
大纲
固定大纲
错误的分类
不可恢复型错误
可恢复型错误
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部