0

0

如何在Golang中处理网络请求错误_Golang网络异常处理思路

P粉602998670

P粉602998670

发布时间:2026-01-15 13:15:10

|

439人浏览过

|

来源于php中文网

原创

应优先用类型断言判断net.Error接口的Timeout()和Temporary()方法;http.Client.Timeout不控制DNS/TLS等前置阶段,需通过http.Transport细化超时;务必关闭resp.Body以防连接泄漏;重试需区分错误类型,避免对不可重试错误盲目重试。

如何在golang中处理网络请求错误_golang网络异常处理思路

判断 net.Error 类型比直接检查错误字符串更可靠

Go 的网络操作(如 http.Getnet.Dial)返回的错误多数实现了 net.Error 接口,它提供了 Timeout()Temporary() 方法。相比用 strings.Contains(err.Error(), "timeout") 这类脆弱匹配,应优先用类型断言:

if netErr, ok := err.(net.Error); ok {
    if netErr.Timeout() {
        // 处理超时,比如重试
    }
    if netErr.Temporary() {
        // 可能是临时性故障(如连接被拒、DNS 暂不可用)
    }
}

注意:Timeout() 返回 true 并不意味着一定是 context.DeadlineExceeded;而 context.DeadlineExceeded 是独立的错误值,需单独判断。

http.ClientTimeout 字段不控制 DNS 解析和 TLS 握手

http.Client.Timeout 仅作用于整个请求生命周期(从发送开始到响应 body 读取完成),但 DNS 查询、TLS 握手、TCP 连接建立这些前置阶段不受其约束。常见表现是:设置 Timeout: 5 * time.Second,但遇到 DNS 故障时卡住 30 秒才报错。

  • 解决办法是用 http.Transport 分别控制各阶段:
  • DialContext 控制 TCP 连接(含 DNS 解析)
  • TLSHandshakeTimeout 控制 TLS 握手
  • ResponseHeaderTimeout 控制 header 返回时间

示例关键配置:

立即学习go语言免费学习笔记(深入)”;

先见AI
先见AI

数据为基,先见未见

下载
client := &http.Client{
    Timeout: 5 * time.Second,
    Transport: &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   3 * time.Second,
            KeepAlive: 30 * time.Second,
        }).DialContext,
        TLSHandshakeTimeout:   3 * time.Second,
        ResponseHeaderTimeout: 3 * time.Second,
    },
}

不要忽略 resp.Body.Close() 导致的连接泄漏和超时误判

即使请求失败(如 resp.StatusCode >= 400),只要 resp 非 nil,resp.Body 就一定存在且必须关闭。否则:

  • 底层 TCP 连接不会被复用,连接池快速耗尽
  • 后续请求可能因无可用连接而阻塞在 DialContext 阶段,表现为“假超时”
  • http.DefaultClient 默认复用连接,不关 body 会隐式拖慢整个客户端

正确写法始终包含 defer resp.Body.Close(),哪怕只读 status:

resp, err := client.Get("https://api.example.com")
if err != nil {
    return err
}
defer resp.Body.Close() // 即使下面要 return error,也必须先 close

if resp.StatusCode != http.StatusOK { return fmt.Errorf("bad status: %d", resp.StatusCode) }

重试逻辑里要区分可重试与不可重试错误

不是所有网络错误都适合重试。盲目重试 http.StatusForbiddennet.ErrClosed 只会放大问题。

  • 建议重试:net.OpError(连接拒绝、无路由)、context.DeadlineExceeded(非最终超时)、http.ErrUseLastResponse
  • 禁止重试:http.StatusUnauthorizedhttp.StatusForbiddenhttp.StatusNotFoundnet.ErrClosedurl.Error 中的 malformed URL
  • 谨慎重试:TLS 相关错误(如 x509.UnknownAuthorityError)通常不可修复,重试无意义

真正棘手的是中间状态——比如 TCP 连接成功但服务端进程崩溃,此时收到 RST 包,Go 报 read: connection reset by peer,这类错误是否重试,得结合业务语义判断。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

389

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

0

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号