陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23195 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

18|错误处理:为什么Rust的错误处理与众不同?

anyhow库
thiserror库
catch_unwind的应用
Rust的态度
互相转换
辅助函数
?操作符
must_use标注
函数式编程的优势
Maybe和Either类型
错误类型的表征
异常滥用
异常安全
异常的问题
异常的优点
Golang的扩展
局限性
Rust错误处理的提升空间
Rust的错误处理优势
Rust的错误处理方式
Error trait和错误类型的转换
panic!和catch_unwind
函数式错误处理
Option和Result
使用类型系统
使用异常
使用返回值(错误码)
拓展阅读
思考题
小结
Rust的错误处理
错误处理的主流方法
错误处理的重要性
错误处理

该思维导图由 AI 生成,仅供参考

你好,我是陈天。
作为被线上业务毒打过的开发者,我们都对墨菲定律刻骨铭心。任何一个系统,只要运行的时间足够久,或者用户的规模足够大,极小概率的错误就一定会发生。比如,主机的磁盘可能被写满、数据库系统可能会脑裂、上游的服务比如 CDN 可能会宕机,甚至承载服务的硬件本身可能损坏等等。
因为我们平时写练习代码,一般只会关注正常路径,可以对小概率发生的错误路径置之不理;但在实际生产环境中,任何错误只要没有得到妥善处理,就会给系统埋下隐患,轻则影响开发者用户体验,重则会给系统带来安全上的问题,马虎不得。
在一门编程语言中,控制流程是语言的核心流程,而错误处理又是控制流程的重要组成部分。
语言优秀的错误处理能力,会大大减少错误处理对整体流程的破坏,让我们写代码更行云流水,读起来心智负担也更小。
对我们开发者来说,错误处理包含这么几部分:
当错误发生时,用合适的错误类型捕获这个错误。
错误捕获后,可以立刻处理,也可以延迟到不得不处理的地方再处理,这就涉及到错误的传播(propagate)。
最后,根据不同的错误类型,给用户返回合适的、帮助他们理解问题所在的错误消息。
作为一门极其注重用户体验的编程语言,Rust 从其它优秀的语言中,尤其是 Haskell ,吸收了错误处理的精髓,并以自己独到的方式展现出来。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust的错误处理方式与其他语言有所不同,它采用了使用类型系统来构建主要的错误处理流程的方式。文章介绍了Rust的错误处理特点,包括Option和Result类型的使用、?操作符的简化错误传播、函数式错误处理、panic!和catch_unwind的异常处理能力,以及Error trait和错误类型的转换。Rust通过这些特性,使错误处理更加安全、高效和简洁,避免了传统错误处理方式的诸多问题。总结来说,Rust的错误处理方式充分利用了语言本身的能力,使得代码简洁明了,几乎接近于异常处理的方式。尽管标准库在错误处理方面还有提升空间,但相信未来会给出更好更方便的答案。文章还提出了一个思考题,邀请读者分享对于开发类似Redis的缓存服务器时需要定义哪些错误以及原因。整体而言,本文为读者提供了深入了解Rust错误处理特点的概览,对于想要了解Rust错误处理方式的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • Marvichov
    https://github.com/dtolnay/thiserror > Use **thiserror** if you care about designing your own dedicated error type(s) so that the caller receives exactly the information that you choose in the event of failure. This most often applies to library-like code. Use **Anyhow** if you **don't care** what error type your functions return, you just want it to be easy. This is common in application-like code.

    作者回复: 👍

    2021-12-12
    2
    6
  • 记事本
    这章比较简单,打卡!

    作者回复: 加油!

    2021-10-04
    3
  • ddh
    之前看过rust错误处理的知识,不是很清稀,今天完全明朗了, 哈哈

    作者回复: 👍

    2021-11-11
    1
  • 阿海
    从这章就可以看出老师平时理解了很多技术领域的东西,很想知道老师有博客之类的的吗

    作者回复: 我有个公众号:programmer_life

    2021-10-04
    1
  • qinsi
    golang 中可用 errors.Errorf 或 (go1.13+)fmt.Errorf 实现错误嵌套。 大致看了下rust中要实现相同的功能的话,也是要先定义自定义的错误类型,然后实现Error trait。这一步可以手动实现,或是使用thiserror来derive。wrap错误时则可以用Box<Error>或anyhow,不过就失去了自定义错误类型的好处。还是通过thiserror来生成From trait的实现为好,这样就可以通过`?`一路"开火车"下去了。 有意思的是上述golang中的errors pkg原本就是为了解决标准库中Error无法嵌套等问题而产生的第三方库,在社区流行开之后就被标准库吸收了其中的思想。rust生态中的错误处理应该也会经历相似的发展阶段吧。

    作者回复: 会的。未来不排除类似 thiserror 的库被吸收进去。

    2021-10-04
    1
  • 罗杰
    第一时间打卡

    编辑回复: 哈哈棒👍

    2021-10-04
    1
  • nuan
    晕了几章后,稍稍轻松一下。
    2022-02-09
    13
  • Geek_6b6c0a
    Railroad oriented programming 是我最喜欢的talk之一,没想到在这里看到了哈哈
    2023-02-08归属地:美国
    1
  • 三万棵树
    不黑不吹,讲解真的清晰,对比某些人的专栏,简直是优秀
    2024-02-22归属地:北京
  • David.Du
    学到了,谢谢!!
    2023-11-03归属地:辽宁
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部