有些语言(如 Go、Rust、C 的传统)不用异常机制,主要考虑:异常是隐式的控制流跳转,看代码签名无法知道会抛出什么;栈展开成本高,异常路径性能不可预测,不适合实时/系统编程;异常的抛出点与处理点分离,容易写出资源泄漏或遗漏处理的代码。Go 用多返回值 error 显式传递错误,Rust 用 Result 类型把错误纳入类型系统,强制调用方面对失败。

异常机制的利:错误处理与正常逻辑分离,代码更清爽;错误可沿调用栈自动传播到能处理它的层级,不用每层手工判断返回码;可携带丰富的上下文(堆栈、消息)。

弊:控制流不透明,像"分布式 goto";滥用 checked exception 会污染整个调用链的签名;throw/catch 有性能开销(构建堆栈轨迹);吞异常(空 catch)会掩盖 bug。

实践建议:异常只用于真正的"异常"情况,不用于常规流程控制;低层抛具体异常,高层转译为业务异常;资源用 try-with-resources 保证释放。

追问方向:checked 与 unchecked 异常的取舍?Spring 为什么统一转 RuntimeException?

(约 340 字)