# 返回和错误处理

飞鸽传书、八百里加急，自古以来，掌权者最需要的都是及时获得对某个事物的信息反馈，在此过程中，也定义了相应的应急处理措施。

社会演变至今，这种思想依然没变，甚至来到计算中的微观世界，也是如此。及时、准确的获知系统在发生什么，是程序设计的重中之重。因此能够准确的分辨函数返回值是正确的还是错误的、以及在发生错误时该怎么快速处理，成了程序设计语言的必备功能。

Go语言为人诟病的其中一点就是`if err != nil {}`的大量使用，缺乏一些程序设计的美感，不过我倒是觉得这种简单的方式也有其好处，就是阅读代码时的流畅感很强，你不需要过多的思考各种语法是什么意思。与Go语言不同，Rust博采众家之长，整出了颇具自身色彩的返回值和错误处理体系，本章我们就从高屋建瓴的角度来学习，更加深入的讲解见[此章](../../errors/intro.md).

## Rust的错误哲学
错误对于软件来说是不可避免的，因此一门优秀的编程语言必须有其完整的错误处理哲学。在很多情况下，Rust需要你承认自己的代码可能会出错，并提前采取行动，来处理这些错误。

Rust中的错误主要分为两类：
- **可恢复错误**, 通常用于从系统全局角度来看可以接受的错误，例如处理用户的访问、操作等错误，这些错误只会影响某个用户自身的操作进程，而不会对系统的全局稳定性产生影响
- **不可恢复错误**,刚好相反，该错误通常是全局性或者系统性的错误，例如数组越界访问，系统启动时发生了影响启动流程的错误等等，这些错误的影响往往对于系统来说是致命的

很多编程语言，并不会区分这些错误，而是直接采用异常的方式去处理。Rust没有异常，但是Rust也有自己的卧龙凤雏：`Result<T,E>`用于可恢复错误，`panic!`用于不可恢复错误。