recover
# recover
recover 只有在同一 goroutine 的延迟函数中调用才有效。服务入口可用它隔离单个请求的异常,但恢复后必须返回明确失败。
defer func() {
if value := recover(); value != nil {
log.Printf("panic: %v", value)
http.Error(w, "internal server error", http.StatusInternalServerError)
}
}()
1
2
3
4
5
6
2
3
4
5
6
recover 不能捕获其他 goroutine 的 panic。每个需要隔离的任务都应在自身入口建立边界,并记录足够的堆栈信息用于诊断。不要用 recover 吞掉错误后继续返回成功结果。