程序中的错误处理
错误的分类
编程中遇到的非正常情况, 一般有两类:
- 错误(Error), 错误指可能出现问题的地方出现了问题, 比如 HTTP 连接超时, 打开一个不存在的文件; 意料之中, 有办法解决, 通常和业务相关联.
- 异常(Exception), 完全不可预料的错误. 比如 空指针, 数组越界; 通常是非业务相关的
很多语言没有对这些错误进行划分, 如 Java, Ruby, JS 都没有在语言层面上对以上情况进行划分. 以至于开发者把一切非正常情况, 都当做异常处理, 这样的做法不利于管理.
而在开发过程中有些错误需要在第一时间暴露出来, 才不至于传播到生产环境造成进一步危害.
一些编程语言在语言层面做了一些区别, 如 GO 在语言层面上区分了 异常(Panic) 和 错误(Error), 强制开发人员显式地处理错误. Rust 也增加了 Result<L, R> 和 Panic 类型, 帮助对各种错误进行分类
另外对于一些没有语言层面做支持的编程语言, 社区开发一些函数式的库, 也提供了解决办法, 如 Java 的函数式库vavr 提供了 Either 类型, Kotlin 的 arrow 提供了 Either 类型.