标准答案
- recover 只能在同一个 goroutine 的 defer 中生效,通常放在请求或 worker 入口。
- HTTP 恢复应返回通用 500、记录 trace 和堆栈,并避免重复写响应。
- worker panic 后要决定重启 worker、失败任务或让进程退出,不能静默丢任务。
- panic 处理要限制日志和恢复时间,关键副作用仍靠幂等和状态记录。
题目解析
recover 只能在同一 goroutine 的 defer 中捕获 panic,适合放在 HTTP 或 worker 边界做隔离、记录和失败响应。它不会回滚数据库、撤销已发出的 HTTP 或恢复被破坏的共享状态。
HTTP panic 应避免重复写响应并返回通用 500;worker panic 后要决定重启 worker、标记任务失败或退出进程,保留任务 ID 和堆栈以便恢复。
业务校验、依赖失败和用户冲突应该返回 error。panic 恢复后不能继续使用不确定的对象或连接,关键副作用依靠幂等和对账处理。
常见误区
- 误区:全局 recover 后认为服务完全安全。改正:停止当前请求/任务,评估共享状态和进程健康,必要时退出。
- 误区:panic 后任务没有失败记录。改正:保存任务状态、错误和重试/人工处理路径。
- 误区:把业务校验错误用 panic 传递。改正:使用 error 和稳定错误码,panic 只表示程序无法继续。