在 Go 中捕获网络请求异常需显式传递 error、结构化记录上下文、避免 panic 泄露,并封装可复用请求逻辑;须双重检查 resp 和 err,defer/recover 仅用于顶层 handler,按错误类型分级日志(ERROR/WARN/INFO)。
在 Go 中捕获网络请求异常并统一输出错误日志,关键在于:把 error 显式传递、用结构化日志记录上下文、避免 panic 泄露、封装可复用的请求逻辑。
标准库的 http.Client 本身不会 panic,但业务代码中若手动调用 panic() 或访问空指针,可能触发崩溃。可在 HTTP handler 中加一层保护:
http.HandleFunc 包裹的函数)里用 defer/recover,不建议在每个请求内部嵌套Go 的 HTTP 请求必须同时检查 resp 和 err,因为即使 err == nil,resp.StatusCode 也可能非 2xx(比如 404、502):
err != nil:处理连接失败、超时、DNS 错误等底层异常resp.StatusCode = 300:处理业务级 HTTP 错误resp.Body.Close(),否则会泄漏连接(哪怕出错也要关)写一个带日志和重试(可选)的通用请求函数,把错误分类记录:
url.Error 提取 Err 和 Timeout() 判断是否超时*http.Response 记录状态码、URL、耗时、响应头大小等上下文zap 或 log/slog)输出,字段包括:method、url、status、duration_ms、error
不是所有错误都要记 ERROR 级别。按影响程度分级记录更利于排查:
io.EOF 或 context.Canceled
当作错误打 ERROR,它们常是客户端主动断开