新闻详情

新闻详情

首页 / 资讯中心 / 详情

Go 错误处理规范:errors.Is / As 与自定义错误类型实战

发布时间:2026/10/2 2:23:49来源:尧图网络
Go 错误处理规范:errors.Is / As 与自定义错误类型实战
Go 错误处理规范errors.Is / As 与自定义错误类型实战错误处理是 Go 项目的一致性语言。掌握 errors.Is / As、Sentinel、自定义 ErrorType能让项目质量上一个台阶。一、Go 错误是值iferr:doSomething();err!nil{returnerr}错误是类型为error的接口变量内部包含字符串与包装链。二、errors.Is / errors.Asimporterrorserr:fmt.Errorf(db unavailable: %w,sql.ErrConnDone)iferrors.Is(err,sql.ErrConnDone){...}// 通过 wrap 也能识别errors.Is 自底向上比对 Sentinel 错误。errors.As 用于断言错误为某类型。三、自定义错误类型typeValidationErrorstruct{FieldstringIssuestring}func(e*ValidationError)Error()string{returnfmt.Sprintf(invalid %s: %s,e.Field,e.Issue)}// 业务层returnValidationError{Field:age,Issue:0}调用方varverr*ValidationErroriferrors.As(err,verr){fmt.Println(verr.Field,verr.Issue)}四、Sentinel 错误var(ErrNotFounderrors.New(not found)ErrUnauthorizederrors.New(unauthorized))Sentinel 在调用方做 identity 比较iferrors.Is(err,ErrNotFound){returnhttp.StatusNotFound}五、with stack traceimportgithub.com/pkg/errorserr:errors.Wrap(sql.ErrConnDone,fetch user)errors.Wrap自动携带堆栈fmt.Printf(%v\n, err)能打印。缺点与 Go 1.13 标准 fmt.Errorf %w 融合时容易出现包栈重复。六、实战handler 错误封装funcWriteErr(c*gin.Context,errerror){varverr*ValidationErroriferrors.As(err,verr){c.JSON(http.StatusBadRequest,gin.H{code:verr.Field,msg:verr.Issue,})return}iferrors.Is(err,ErrUnauthorized){c.JSON(http.StatusUnauthorized,gin.H{code:UNAUTH})return}slog.Error(internal,err,err)c.JSON(http.StatusInternalServerError,gin.H{code:INTERNAL})}业务代码只关心 Wrap 上层业务无关错误在 handler 转 HTTP code。七、错误分类策略程序错误panic开发者改业务错误error用户/输入问题基础设施错误网络/数据库 → 重试或熔断每种分清楚重试逻辑更准。八、不要做的事panic 给业务error 中放敏感数据密码、token自定义错误不实现 Error()或者提供接口但内部 nil check 忘了九、踩坑清单errChain 嵌套太深——%w 多层包装对性能略有影响sentinel 不可变——不能动态赋值fmt.Print(“%v”) 隐藏 wrap 链十、总结与展望errors.Is/As 是 1.13 后推荐的现代错误处理方式。Sentinel Wrap Type 三种模式组合让代码既可读又可测试。未来Go 1.24 可能加入errors.Join跨多个 error 收集。十一、参考文献Go 官方博客Working with Errors in Go 1.13pkg/errors READMEUber Go 风格指南
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Unity移动VR性能优化:GPU实例化与内存管理实战,稳定90Hz 2026/10/2 4:58:00

Unity移动VR性能优化:GPU实例化与内存管理实战,稳定90Hz

写到第五篇,我自己都能感觉到整个项目已经从一个“能不能把这么大的村庄放进去”的质疑,变成一个“怎么让它每分每秒都保持流畅”的打磨过程。前四篇里,我先后处理了风格化资源的选型和面数控制,把 Unity 的渲染管线切到适合移动端…

阅读更多 →
OpenClaw个人智能体部署与A2A协同实战:从单机养虾到多智能体组队 2026/10/2 4:57:54

OpenClaw个人智能体部署与A2A协同实战:从单机养虾到多智能体组队

1. 从“你养龙虾了?”说起:个人智能体到底在养什么第一次听到“你养龙虾了?”这个说法,我愣了三秒。后来才反应过来,这是圈子里对部署 OpenClaw 这类个人智能体的一种戏称——就像养宠物一样,你得给它搭窝&…

阅读更多 →
AI Agent并发实战与智能体工程化落地指南 2026/10/2 4:57:54

AI Agent并发实战与智能体工程化落地指南

1. 今日头版:AI Agent进入“并发实战”考察期1.1 热搜最密集的词不是模型,而是Agent今天后台的搜索热词里,单条“ai agent”的检索热度冲得很高,紧随其后的还有“多ai协作”“ai agent 怎么扛并发”。这个现象挺有意思&#xff1a…

阅读更多 →
DeepSeek Harness桌面端实操:从安装配置到技能库工作流全解析 2026/10/2 4:57:54

DeepSeek Harness桌面端实操:从安装配置到技能库工作流全解析

最近DeepSeek Harness悄悄出了桌面端,这事在AI工具圈里传得挺快。我第一时间下下来扒了一遍,从安装包结构到工作流配置,从API对接到底层skill机制,基本都摸了一遍。这篇文章不讲虚的,直接把我踩过的坑、看懂的源码目录…

阅读更多 →
AI浏览器与AI手机智能体越权风险:端侧Agent安全边界与防护实践 2026/10/2 4:57:54

AI浏览器与AI手机智能体越权风险:端侧Agent安全边界与防护实践

1. 当手机和浏览器开始“自作主张”:一个被忽视的风险切面过去一年我一直在折腾端侧智能体和AI浏览器的自动化链路,从最早的简单脚本到后来的多智能体协作框架,踩过的坑比写过的代码还多。最开始我的关注点全在“怎么让Agent更聪明”上——怎…

阅读更多 →
群晖NAS搭建Git Server:SSH权限与ACL实战指南 2026/10/2 4:57:54

群晖NAS搭建Git Server:SSH权限与ACL实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉