知识卡片

可恢复错误与不可恢复错误的分野

专业/工作 · 754.a

内容

Swift把错误明确分成两类,用完全不同的机制处理。可恢复错误——文件不存在、服务器连不上——是程序运行中预期会发生、调用方应该有能力应对的情况,用throws/try/do-catch处理,让程序在报告问题后继续运行。不可恢复错误——如[[强制展开与可空实例绑定的安全性分野]]中对nil的强制展开、数组越界——本质上是程序自身的bug,一旦发生说明某个不变量已被打破,继续运行只会导致更难排查的错误状态或错误结果,Swift选择直接触发陷阱让程序当场终止。区分两者用不同工具:assert(_:_:)只在调试构建中检查不变量、方便开发期定位问题,precondition(_:_:)签名和行为一样但发布构建也保留,用于绝不能违反的运行时保证。选错工具的后果很直接——用throws处理本该是bug的情况会掩盖真正的程序错误,用陷阱处理本可恢复的失败则会让程序对着可预期的输入直接崩溃。

参考来源

《Swift编程权威指南》第20章《错误处理》