Rust: Structuring and handling errors in 2020- 学习笔记

直接上菜, 首先介绍两个新的Crate用于Rust Error处理,anyhow 和thiserror, 其代表Rust Error处理的最新探索成果! anyhow面向Application应用程序开发, thiserror面向Library开发, 为什么一个Rust Error处理需要分成两个Crate来处理呢?! 理由如下:

(1) 库应专注于生成有意义的结构化错误类型/变体。这允许应用程序轻松区分各种错误情况。

(2) 应用程序主要消化错误。

(3) 库需要将错误从一种类型转换为另一种类型。比如:将底层IO错误封装进本库提供的高级错误,这样调用者才能区分此底层IO错误具体来自于那个库。

(4) 库在更改错误或创建新错误时必须小心,因为这些错误很容易为调用者引入破坏性更改。所以要求库可以更容易地更改和新建错误,同时尽可能避免祸及调用者。

(5) 库返回错误,而应用程序需要决定这些错误是否格式化以及如何显示给人。

(6) 应用程序可能还希望分析和检查错误,例如将错误转发到异常跟踪系统,或者在认为安全时重试操作。

(7) 库的pub API应该始终使用std::Result和自定义Error 类型(并且它impl了std::error::Error Trait) ,而failure::Fail这类Rust Error处理Crate没有能与Rust原生的Error处理很好地融合, 独自创造了一套,也难以很好的和用户代码相融合, 增加了用户学习负担。

总结: 基于以上理由, 将错误处理分为两个crate就非常必要了!同时提炼出优质Rust Error处理crate的特性: A. 可以与Rust原生Error处理很好融合。B. 可以与用户代码很好地融合,最好是不漏踪迹,不污染用户代码。 C. 极大地降低学习和使用负担,最好零负担。 D. 非常容易更改和新建错误,不会导致调用者破坏性修改代码。 E. 可以backtrace, 清晰表达错误类型、源头和传播路径。 F. 可以给每个错误以人性化的可读信息。G. 灵活有效的错误分析、检查、转发、重试机制。

【详细内容请看】:https://nick.groenen.me/posts/rust-error-handling/

参照原文,我整理调试出两个代码例子, thiserror_t 和anyhow_t, 放到了https://github.com/yujinliang/rust_learn/tree/master/rust_my_error , 有兴趣可以看看。

  • Author

RUST学习随笔,如有谬误,尽请指正,谢谢。

作者:心尘了

email: 285779289@qq.com

  • Reference:

https://nick.groenen.me/posts/rust-error-handling/

https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html

https://mozillazg.com/2017/10/rust-cargo-use-local-crate-package.html

https://doc.rust-lang.org/rust-by-example/cargo/deps.html

`《深入浅出Rust》 范长春著 机械工业出版社`

Rust:Structuring and handling errors in 2020学习笔记相关推荐

  1. Altium Designer 2020 学习笔记(一)-----原理图及原理图库部分(配动态图操作演示)

    本篇文章主要与大家简要分享一下,我在AD学习过程中的一些学习笔记,本篇文章主要关于原理图及原理图库部分. 本系列文章链接: -------------------------------------- ...

  2. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  3. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  4. Yann Lecun纽约大学《深度学习》2020课程笔记中文版,干货满满!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]Yann Lecun在纽约大学开设的2020春季<深度学习>课 ...

  5. 2020年高等数学方法与提高(上海理工大学)学习笔记汇总

    写在前面: [1] 本系列文章涉及内容已与授课教师联系,已获得许可.如有不妥之处,请联系博主740925018@qq.com. [2] 对授课教师表示衷心感谢.贾老师的高等数学方法与提高.数学分析等课 ...

  6. Handling Errors Exceptionally Well in C++ 在C++中良好地捕获意外的错误

    Handling Errors Exceptionally Well in C++ 在C++中良好地捕获意外的错误 from:http://www.cprogramming.com/tutorial/ ...

  7. 工程伦理第三章学习笔记2020最新

    工程伦理第三章学习笔记2020最新 因为之前自己在网上找答案总是觉得费劲,一道一道的找,很慢,突然找到了前两章的答案,感觉有一种前人种树后人乘凉的感觉,于是自己在艰难找完第三章习题并全对的情况下,将题 ...

  8. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾

    FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一 FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二 ...

  9. PYTHON学习笔记之(一)2020.08

    PYTHON学习笔记之(一)2020.08 Python基础 数据类型 常见的列表.字典,以及元组.集合. 1 列表 list 1.1 列表转换字符串 stu = ['王一', '李二', '张三'] ...

最新文章

  1. git通过authorized_keys来管理用户的权限(二)
  2. 深度优先搜索(DFS)相关习题
  3. pythonweb开发需要学哪些知识,python web需要了解哪些
  4. Ubuntu12.04 LTS 忘记登录密码的解决方法
  5. 第二轮冲次会议第六次
  6. mysql免安装出现1067_mysql,免安装,1067错误
  7. Commons net实现 FTP上传下载
  8. android 测试 mock,Mock在Android TDD中的使用
  9. mysql 分区 扩充_mysql分区LVM扩容
  10. 萌新的Python练习菜鸟100例(十六)输出指定格式的日期。
  11. 利用ros3d.js实现 turtlebot3 在web 端显示并导航
  12. 阿里云 部署并开启nodejs应用
  13. Pytorch模型构造方法
  14. java sqlite 密码保护_密码保护SQLite数据库 . 可能吗?
  15. 性能测试常用的linux命令
  16. 勒索软件的激荡三十年
  17. 手机版qq邮箱一直连接服务器失败,手机qq邮箱网页版无法登录 求高手 QQ邮箱登不上去 显示找不到服务器15?请问我咋用不...
  18. 既有禀赋上的自然延展:中国移动咪咕进军元宇宙的底层逻辑
  19. Linux 重定向和追加(、 指令)
  20. 盛迈坤电商:拼多多推广数据多久会显示

热门文章

  1. K210识别数字(0~9)并与单片机通信通过数字来控制小车移动
  2. weblogic BEA-170011
  3. Tableau 八、数据分层、数据分组、数据集
  4. 京东再次偷袭在线旅游
  5. 小车运料c语言编程,西门子PLC编程实例及技巧(运料小车控制系统)
  6. nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 的解决办法
  7. P528 List接口常用实现类的对比及源码分析
  8. O - 鸣人和佐助(BFS)
  9. python通过Tkinter库实现的一个简单的文本编辑器源码
  10. Anchor-free系列——FoveaBox: Beyond Anchor-based Object Detector