Go语言第九章(错误处理)
错误处理Go没有try / catch。日常约定是能预期的失败参数不对、查无此人、除数为 0→ 返回error由调用方决定怎么处理。不该发生、程序状态已不可信下标越界、断言失败、严重逻辑崩坏→ 用panic必要时再在上层用deferrecover兜底。本文用「九九乘法表」同一个业务场景对比这两种写法的差别。业务错误 vs 程序错误类型常见手段出错后同函数里后面的代码典型场景业务错误返回(结果, error)还能继续走只要你没return用户输入非法、业务校验失败程序错误panic不再执行即使recover了也是如此严重异常、不可恢复状态记住口诀业务错误是「报告给调用方」程序错误是「当前这条执行路径断了」。业务错误返回errorerror是内置接口只有一个方法Error() string。没出错返回nil有错返回非nil。下面要求参数必须是9才打印九九表传8时返回错误。注意处理完错误之后main里的「其余逻辑」仍然会执行。packagemainimport(errorsfmt)// 业务校验失败返回 error不中断整个程序funcnn(aint)(bool,error){ifa!9{returnfalse,errors.New(请输入9)}fori:1;ia;i{fork:1;ki;k{fmt.Printf(%d * %d %d ,k,i,i*k)}fmt.Println()}returntrue,nil}funcmain(){success,err:nn(8)iferr!nil{fmt.Println(err,执行失败)}else{fmt.Println(success,执行成功)}// 业务错误只是「这次调用失败」后面的代码照常走fmt.Println(其余逻辑)}输出类似请输入9 执行失败 其余逻辑要点用errors.New(说明)或fmt.Errorf(a%d 非法, a)创建错误。调用方标准姿势if err ! nil { ... }。返回错误后函数正常结束调用方可以打日志、换参数重试也可以继续干别的事。程序错误panic把「请输入 9」改成panic。一旦触发从panic那一行开始同函数里后面的代码不会再跑。先看没有recover的情况——进程会直接崩溃packagemainimportfmtfuncnn(aint)(bool,error){ifa!9{panic(请输入9)// 程序错误直接中断当前执行路径}fori:1;ia;i{fork:1;ki;k{fmt.Printf(%d * %d %d ,k,i,i*k)}fmt.Println()}returntrue,nil}funcmain(){success,err:nn(8)iferr!nil{fmt.Println(err,执行失败)}else{fmt.Println(success,执行成功)}// 上面已经 panic这行永远走不到fmt.Println(其余逻辑)}运行后会看到 panic 栈且没有「其余逻辑」。这就是和业务错误最大的差别。defer 用法defer会把一次函数调用推迟到当前函数即将返回之前执行常用于关文件、解锁、以及配合recover捕获panic。基本顺序先写正常逻辑defer的内容最后跑。packagemainimportfmtfuncmain(){fmt.Println(开始)deferfmt.Println(defer收尾)fmt.Println(业务逻辑)}输出开始 业务逻辑 defer收尾多个defer按后进先出LIFO执行——最后注册的最先跑packagemainimportfmtfuncmain(){deferfmt.Println(第一)deferfmt.Println(第二)deferfmt.Println(第三)fmt.Println(函数体)}输出函数体 第三 第二 第一和错误处理相关的关键点recover必须写在defer里才有效普通代码里调用recover()拿不到 panic。defer常用来保证「出错也要收尾」关文件、释放锁、打印现场。参数在写defer那一刻就算好不是真正执行时才算。更多细节见「Go 函数」一文的 defer 小节。用deferrecover兜住 panic加上recover后进程不会崩溃可以打印 panic 信息但panic发生点之后的代码仍然不会执行。packagemainimportfmtfuncnn(aint)(bool,error){ifa!9{panic(请输入9)}fori:1;ia;i{fork:1;ki;k{fmt.Printf(%d * %d %d ,k,i,i*k)}fmt.Println()}returntrue,nil}funcmain(){deferfunc(){ifinfo:recover();info!nil{fmt.Println(捕获到程序错误:,info)}}()success,err:nn(8)// 这里 paniciferr!nil{fmt.Println(err,执行失败)}else{fmt.Println(success,执行成功)}// panic 之后同函数里这些代码依然不走fmt.Println(其余逻辑)}输出类似捕获到程序错误: 请输入9没有「执行失败 / 执行成功」也没有「其余逻辑」。recover的作用是拦住崩溃不是从 panic 下一行接着跑。怎么选情况建议用户输错、查不到数据、权限不够返回error库函数约定用error如os.Open跟着返回 / 包装error明显的编程错误、不可继续的状态可以panic服务入口想避免整个进程挂掉边界处deferrecover打日志后返回错误响应入门阶段优先练好if err ! nilpanic/recover留给真正的异常路径不要拿来代替普通业务校验。作业返回 error写divide(a, b int) (int, error)b 0时返回错误否则返回商。在main里分别用(10, 2)和(10, 0)调用并处理。业务错误对比改写文中的nn允许传入19任意整数打印对应乘法表小于1或大于9时返回error。调用失败后打印一句「其余逻辑」确认它仍会执行。defer 顺序在main里注册三个defer打印A、B、C再打印一句「函数体」观察输出顺序是否为「函数体 → C → B → A」。panic 与 recover写一个函数mustPositive(n int)n 0时panic。在main里用deferrecover捕获打印 panic 信息并在调用后面再写一句fmt.Println(其余逻辑)验证它不会执行。综合练习写printTable(n int) error业务错误版和mustPrintTable(n int)n ! 9就panic。在main里先演示返回error后后续代码仍运行再用recover演示panic被兜住但后续代码不运行。

相关新闻

r0capture 安卓抓包实战:应用层 SSL 流量解密全流程

r0capture 安卓抓包实战:应用层 SSL 流量解密全流程

r0capture 安卓抓包实战:应用层 SSL 流量解密全流程 【免费下载链接】r0capture 安卓应用层抓包通杀脚本 项目地址: https://gitcode.com/gh_mirrors/r0/r0capture 你搭好代理,App 流量却卡在握手阶段——SSL Pinning 把通道锁死,抓包…

2026/8/22 22:03:51 阅读更多 →
学习期货量化,这几点注意事项需要提前知道

学习期货量化,这几点注意事项需要提前知道

文章摘要:本文是一份期货量化入门指南,系统梳理了从明确学习目标、掌握规则代码数据统计四件套,到识别回测陷阱(过拟合、幸存者偏差等)、打通交易环境、落实风控纪律的全流程要点。旨在帮助初学者避开常见误区&#xf…

2026/8/22 22:03:51 阅读更多 →
电子合同存档合规吗?HR 别让归档年限坑了企业

电子合同存档合规吗?HR 别让归档年限坑了企业

劳动合同丢了还能补,可要是连补的资格都过了时效,企业就只能吃哑巴亏。很多 HR 把电子合同存进系统就当万事大吉,真被问起「这份合同按规定要留几年」,往往答不上来。 电子合同存不存得住、存不存得合规,比签得快不快更…

2026/8/22 22:03:51 阅读更多 →

最新新闻

AI面试官2026版核心技术解析与应用前景

AI面试官2026版核心技术解析与应用前景

1. 项目背景与定位解析 "海纳AI面试官"作为智能招聘领域的创新产品,其2026版进化蓝图揭示了未来三年AI面试技术的突破方向。我在人力资源科技领域深耕八年,见证了从早期视频面试工具到如今具备情感识别的智能面试官的迭代过程。这个蓝图最吸引…

2026/8/24 7:50:45 阅读更多 →
Java并发编程中的资源隔离实战与面试解析

Java并发编程中的资源隔离实战与面试解析

1. 面试官为什么总爱问资源隔离?每次Java面试到并发编程环节,资源隔离这个话题就像固定节目一样必然出现。去年我在大厂担任技术面试官时,曾在一天内对7个候选人抛出过这个问题,结果能完整说出实现方案的不到三分之一。这让我意识…

2026/8/24 7:50:45 阅读更多 →
零基础到华为大模型实习:AI学习路径与实战经验

零基础到华为大模型实习:AI学习路径与实战经验

1. 从零基础到华为大模型实习:我的AI学习与求职之路作为一名非科班出身的程序员,我在过去18个月里完成了从Python小白到华为大模型团队实习生的蜕变。这段经历中最宝贵的不是最终拿到offer的结果,而是摸索出的那套可复制的AI学习路径。现在我…

2026/8/24 7:50:45 阅读更多 →
基于OpenClaw与GLM 5.1构建免费AI Agent:本地部署与实战指南

基于OpenClaw与GLM 5.1构建免费AI Agent:本地部署与实战指南

1. 项目概述:当开源框架遇上免费大模型最近在AI圈子里,一个组合开始被频繁提及:OpenClaw加上GLM 5.1。这个组合之所以吸引人,核心就两个字:免费。对于很多想入门AI Agent开发,或者想低成本验证想法的个人开…

2026/8/24 7:50:45 阅读更多 →
AI代理能耗优化:AgentStop框架实现智能推理中断与节能

AI代理能耗优化:AgentStop框架实现智能推理中断与节能

1. 项目概述:当AI代理遇上能耗焦虑最近在折腾本地大语言模型(LLM)应用时,我遇到了一个非常现实的问题:我的笔记本电脑风扇开始像喷气发动机一样狂转,机身烫得能煎鸡蛋。这让我开始思考,我们部署…

2026/8/24 7:50:45 阅读更多 →
Blender 置换贴图从 0 开始:5 分钟给模型做出真实起伏

Blender 置换贴图从 0 开始:5 分钟给模型做出真实起伏

Blender 置换贴图从 0 开始:5 分钟给模型做出真实起伏 【免费下载链接】awesome-blender 🪐 A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesom…

2026/8/24 7:49:45 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →