标准答案

  1. defer 按后进先出执行,参数通常在 defer 声明时求值,闭包要注意变量捕获。
  2. panic 不能跨 goroutine 被另一个 goroutine recover,边界需要各自保护。
  3. HTTP 或任务 worker 可以在顶层 recover 做隔离、日志和失败状态,但不应吞掉错误继续复用损坏状态。
  4. 普通校验失败、依赖失败和用户冲突应使用 error 返回。

题目解析

defer 适合释放资源和记录收尾,panic 表示当前 goroutine 无法按正常路径继续,recover 只能在同一 goroutine 的 defer 中捕获。可预期的校验、依赖和业务失败应返回 error。

HTTP 或 worker 入口可以 recover 做隔离、日志和失败状态,但 recover 不会回滚数据库、撤销外部调用或修复共享状态。异常任务要进入可查询的失败/重试路径。

defer 按后进先出执行,闭包和命名返回值会影响最终结果。恢复逻辑要有界,不能在不确定状态下继续处理同一请求。

常见误区

  • 误区:所有错误都 panic。改正:业务和依赖失败返回 error,panic 只用于不可继续的程序状态。
  • 误区:在父 goroutine recover 捕获子 goroutine。改正:每个 goroutine 在自己的入口设置 defer/recover,或让错误通过任务组传播。
  • 误区:recover 后继续使用不确定状态。改正:终止当前请求/任务,记录状态并通过补偿或重启恢复。

作者信息