全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang进行网络请求错误处理_判断超时和连接失败

Go中需用net.Error接口区分超时(Timeout()为true)和临时连接失败(Temporary()为true但Timeout()为false),避免字符串匹配;应配置带各阶段超时的HTTP Client并精准判断错误类型。

Go 语言中做网络请求时,区分超时(timeout)和连接失败(如 DNS 解析失败、拒绝连接、无路由等)非常关键——因为它们代表不同层级的问题,应采取不同的重试或降级策略。核心在于正确识别错误类型,而不是用 err != nil 一概而论。

使用 net.Error 判断超时和临时性错误

Go 的标准库(如 net/http)在底层会返回实现了 net.Error 接口的错误。该接口有两个重要方法:

  • Timeout() bool:是否为超时错误(包括连接超时、读写超时)
  • Temporary() bool:是否为临时性错误(如连接被拒绝、临时 DNS 失败),可能稍后恢复

注意:Timeout() 为 true 时,Temporary() 通常也为 true;但反过来不成立。例如,DNS 解析超时是 timeout,而 TCP 连接被拒(connection refused)是 temporary 但不是 timeout。

构造带超时的 HTTP Client 避免阻塞

不要依赖 http.DefaultClient,它没有默认超时,容易卡死。应显式配置 http.Client

client := &http.Client{
    Timeout: 10 * time.Second, // 整个请求生命周期上限(含连接、写、读)
    Transport: &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   5 * time.Second,  // 建连超时
            KeepAlive: 30 * time.Second,
        }).DialContext,
        TLSHandshakeTimeout: 5 * time.Second, // TLS 握手超时
        ExpectContinueTimeout: 1 * time.Second,
    },
}

这样,你就能在不同阶段捕获对应错误:

  • 建连超时 → net.OpErrorTimeout()==true
  • TLS 握手超时 → 同样是 Timeout()==true
  • 服务端关闭连接或网络中断 → Temporary()==trueTimeout()==false
  • DNS 解析失败(如域名不存在)→ Temporary()==true(Go 1.19+ 默认为 true)
  • 目标地址不可达(如防火墙拦截、路由失败)→ 通常是 Temporary()==true

精准判断错误类型的推荐写法

避免字符串匹配(如 strings.Contains(err.Error(), "timeout")),应使用类型断言和接口判断:

resp, err := client.Do(req)
if err != nil {
    var netErr net.Error
    if errors.As(err, &netErr) {
        if netErr.Timeout() {
            log.Println("请求超时,可能是网络延迟或服务响应慢")
            // 可考虑重试(需结合幂等性)
        } else if netErr.Temporary() {
            log.Println("临时性网络错误,如连接被拒、DNS 失败")
            // 可立即重试(例如换 endpoint 或稍后重试)
        } else {
            log.Println("非临时、非超时网络错误,如地址格式错误")
            // 一般是代码/配置问题,不应重试
        }
    } else {
        log.Printf("非网络类错误:%v", err)
        // 如 JSON 解析失败、空响应体等
    }
    return
}

补充提示:某些错误(如 http.ErrUseLastResponse 或重定向循环)不属于 net.Error,需单独处理;HTTP 状态码(如 404、503)属于业务层错误,应在 resp.StatusCode 中检查,而非 err

连接失败的典型错误示例与含义

常见非超时但连接失败的情况及判断方式:

  • dial tcp 10.0.0.1:80: connect: no route to hostTemporary()==true,系统找不到通往目标的路由
  • dial tcp: lookup example.invalid: no such hostTemporary()==true(Go ≥1.19),DNS 查询失败
  • dial tcp 127.0.0.1:8080: connect: connection refusedTemporary()==true,目标端口无服务监听
  • read tcp 192.168.1.100:54321->192.168.1.200:80: read: connection reset by peerTemporary()==false,对端异常关闭,一般不重试

这些错误多数可通过 errors.As(err, &netErr) 捕获并分类,无需解析错误字符串。


# js  # json  # go  # golang  # 防火墙  # 端口  # ai  # 路由  # dns  # 状态码  # 标准库  # connection reset  # Error  # 字符串  # bool  # 循环  # 接口  # nil  # http  # 重试  # 被拒  # 稍后  # 你就  # 找不到  # 能在  # 不存在  # 可达  # 不应  # 应在 


相关文章: 头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何在阿里云高效完成企业建站全流程?  装修招标网站设计制作流程,装修招标流程?  制作企业网站建设方案,怎样建设一个公司网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  已有域名和空间如何快速搭建网站?  建站主机CVM配置优化、SEO策略与性能提升指南  如何用低价快速搭建高质量网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  建站ABC备案流程中有哪些关键注意事项?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Android自定义控件实现温度旋转按钮效果  设计网站制作公司有哪些,制作网页教程?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何在云指建站中生成FTP站点?  html制作网站的步骤有哪些,iapp如何添加网页?  如何用好域名打造高点击率的自主建站?  香港服务器租用每月最低只需15元?  C#如何序列化对象为XML XmlSerializer用法  宝塔建站无法访问?如何排查配置与端口问题?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  jQuery 常见小例汇总  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何配置WinSCP新建站点的密钥验证步骤?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何做静态网页,sublimetext3.0制作静态网页?  ,网站推广常用方法?  如何用狗爹虚拟主机快速搭建网站?  香港服务器部署网站为何提示未备案?  建站主机数据库如何配置才能提升网站性能?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站上市公司网站建设方案与SEO优化服务定制指南  中山网站制作网页,中山新生登记系统登记流程?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何快速搭建高效可靠的建站解决方案?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  制作电商网页,电商供应链怎么做?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  c# 在高并发场景下,委托和接口调用的性能对比  怀化网站制作公司,怀化新生儿上户网上办理流程?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  c# 在ASP.NET Core中管理和取消后台任务  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。