错误处理
Go 将错误视为普通值,通过返回值显式传递与处理,而非异常机制。这使控制流清晰可见,是 Go 代码最显著的风格特征。
error 接口
error 是一个仅含一个方法的内置接口:
任何实现了 Error() string 的类型都可作为错误使用。
创建错误
自定义错误类型
当调用方需要依据错误类型分支处理时,定义结构体错误:
错误包装与判定
实际项目中错误会跨函数层传递。Go 1.13 引入 %w 动词与 errors 包,支持包装并保留错误链:
Tip
三种判定方式的选择:
errors.Is:按值匹配,适合预定义的哨兵错误(如os.ErrNotExist)。errors.As:按类型匹配,适合携带上下文的结构体错误。- 直接比较
err == ErrNotFound:仅适用于未包装的错误,包装后失效,不推荐。
约定俗成:包内可导出的哨兵错误以 Err 开头,如 ErrNotFound。
panic 与 recover
panic 表示不可恢复的程序错误(如数组越界、空指针),将中断当前函数调用栈;recover 仅在 defer 中有效,用于捕获 panic 恢复执行:
Warning
使用准则:error 用于预期内的失败,panic 用于程序缺陷。业务代码中不应主动使用 panic 表达错误;HTTP 框架通常在请求入口统一 recover,将 panic 转换为 500 响应,保证单个请求崩溃不拖垮整个服务。
小结
- 错误是值:
if err != nil是 Go 的标准错误处理范式。 %w包装错误保留上下文,errors.Is/As精确判定。- panic 只用于不可恢复缺陷,
recover提供兜底能力。