讲师中心 微信公众号
AI工具推荐 视频效率加速

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

风杰酱_1251

风杰酱_1251

发布时间:2025-12-20 16:44:02

|

865人浏览过

|

来源于php中文网

原创

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

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

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:

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

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
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.OpError,Timeout()==true
  • TLS 握手超时 → 同样是 Timeout()==true
  • 服务端关闭连接或网络中断 → Temporary()==true,Timeout()==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 host → Temporary()==true,系统找不到通往目标的路由
  • dial tcp: lookup example.invalid: no such host → Temporary()==true(Go ≥1.19),DNS 查询失败
  • dial tcp 127.0.0.1:8080: connect: connection refused → Temporary()==true,目标端口无服务监听
  • read tcp 192.168.1.100:54321->192.168.1.200:80: read: connection reset by peer → Temporary()==false,对端异常关闭,一般不重试

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

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

519

2024.02.23

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

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

596

2024.02.23

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

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

1136

2024.02.23

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

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

771

2024.03.05

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

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

1686

2024.05.21

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

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

4754

2025.06.09

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

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

2194

2025.06.10

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

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

4066

2025.06.17

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn