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

2021-10-04 陈天
《陈天 · Rust 编程第一课》
课程介绍


讲述:陈天

时长:大小16.19M


你好,我是陈天。
作为被线上业务毒打过的开发者,我们都对墨菲定律刻骨铭心。任何一个系统,只要运行的时间足够久,或者用户的规模足够大,极小概率的错误就一定会发生。比如,主机的磁盘可能被写满、数据库系统可能会脑裂、上游的服务比如 CDN 可能会宕机,甚至承载服务的硬件本身可能损坏等等。
因为我们平时写练习代码,一般只会关注正常路径,可以对小概率发生的错误路径置之不理;但在实际生产环境中,任何错误只要没有得到妥善处理,就会给系统埋下隐患,轻则影响开发者用户体验,重则会给系统带来安全上的问题,马虎不得。
在一门编程语言中,控制流程是语言的核心流程,而错误处理又是控制流程的重要组成部分。
语言优秀的错误处理能力,会大大减少错误处理对整体流程的破坏,让我们写代码更行云流水,读起来心智负担也更小。

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

  • Marvichov
    2021-12-12
    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.

    作者回复: 👍

    共 2 条评论
    6
  • 记事本
    2021-10-04
    这章比较简单,打卡!

    作者回复: 加油!

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

    作者回复: 👍

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

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

    
    1
  • qinsi
    2021-10-04
    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 的库被吸收进去。

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

    编辑回复: 哈哈棒👍

    
    1
  • nuan
    2022-02-09
    晕了几章后,稍稍轻松一下。
    
    13
  • Geek_6b6c0a
    2023-02-08 来自美国
    Railroad oriented programming 是我最喜欢的talk之一,没想到在这里看到了哈哈
    
    1
  • David.Du
    2023-11-03 来自辽宁
    学到了,谢谢!!
    
    
  • 杨学者
    2023-01-01 来自上海
    请教rust如何对错误进行打印traceback?我发现anyhow和traceback-rs可以打印,this error好像不行,不过anyhow粒度太粗了,不知有啥好办法?
    
    