错误处理的本质,不是“程序报错了怎么办”,而是系统在出现异常情况时,如何决定继续运行、终止运行、释放资源,以及把问题传递给谁。
不同语言在语法和机制上差异很大,但它们最终都在回答同几类问题:
- 什么算错误,什么算 bug
- 哪些错误可以恢复,哪些错误必须终止
- 错误应该如何向上层传播
- 资源应该在什么时机释放
- 异步流程中的错误还能不能沿着原来的调用链处理
错误不止一种
从工程视角看,错误通常至少可以分成两类:
- 可恢复错误:操作失败了,但程序仍然可以决定如何处理,例如文件不存在、网络超时、参数格式不合法
- 不可恢复错误:程序已经进入不可信状态,继续运行可能造成更严重的问题,例如数组越界、空指针解引用、违反内部不变量
