把异常情况交给处理程序

执行中的操作可能遇到无法按常规完成的情况,例如除数为零或文件无法打开。异常机制把有关信息交给处理程序,并改变接下来的控制流程。程序可以主动抛出异常,运行时也可以在特定错误发生时产生异常,让调用链中适合处理问题的位置接手,而不要求每层都立即给出最终决定。

参考:[1]

按类型查找与向外传播

处理程序通常指定自己接受的异常类型。当前调用中没有适合的处理程序时,异常会向调用者传播;找到匹配位置后,再执行相应处理代码。捕获范围影响哪些问题会被接住,过于宽泛的处理可能把原本应暴露的程序缺陷一起隐藏,因此异常类别与处理边界需要共同设计。

参考:[2]

资源清理独立于成功路径

文件、锁和网络连接需要在工作结束时释放,即使中途发生异常也如此。Python的finally子句和上下文管理器把清理放进结构化控制中。清理与恢复是不同任务:释放已取得的资源,并不保证此前对外部系统的写入已撤销;涉及多步修改时,还需要事务或明确的补偿办法。

参考:[1]

保留信息再决定恢复

处理程序可以改用其他方法、向上层报告更清楚的问题,或让异常继续传播。重新抛出与异常链有助于保留原始原因,使日志能说明失败经过。能否重试取决于操作是否适合重复以及失败是否暂时;把所有异常都转成成功结果,会丢掉调用者判断是否完成所需要的信息。

参考:[2]