GO_错误---error、panic、recover 一、error 错误处理1. error 底层本质error是 Go 内置接口仅定义一个Error() string方法gotype error interface { Error() string }只要类型实现该方法就满足error接口用于非致命、可处理的常规错误。2. 两种创建 error 的方式errors.New(错误信息)纯静态字符串错误fmt.Errorf(格式化模板, 参数)支持格式化拼接错误信息gopackage main import ( errors fmt ) func main() { // 方式1errors.New err1 : errors.New(this is err2) fmt.Println(err1.Error()) // 方式2fmt.Errorf 支持格式化 err2 : fmt.Errorf(%s, this is normal err1) fmt.Println(err2.Error()) }3. 实战案例除法函数错误返回业务函数通过多返回值返回结果 error调用方判断err ! nil处理错误Go 最标准错误写法go// MyDiv 除法运算分母为0返回error func MyDiv(a, b int) (int, error) { if b 0 { // 构造错误返回 return 0, errors.New(分母不能为0) } return a / b, nil // 无错误返回nil } func main() { result, err : MyDiv(10, 2) if err ! nil { // 存在错误打印错误信息 fmt.Println(err , err) } else { // 无错误正常使用结果 fmt.Println(result , result) } }核心规范正常业务错误优先使用error不要轻易 panic。二、panic 恐慌1. panic 适用场景发生不可预期、致命、无法继续执行的错误时触发主动显式调用panic(错误信息)运行时异常自动触发数组 / 切片越界、nil 指针解引用、类型断言失败等2. 示例 1手动触发 panicgofunc testa() { fmt.Println(aaaaaaaaaaa) } func testb() { // 主动抛出panic程序会终止无recover时 panic(this is a panic test) } func main() { testa() testb() fmt.Println(这段代码不会执行) }3. 示例 2运行时数组越界自动 panicgo// x传入超过数组下标范围会触发panic func testb(x int) { var arr [10]int // 下标 0~9 arr[x] 111 // x20 数组越界自动panic } func main() { testb(20) }panic 执行流程触发 panic 后停止当前函数正常执行逆序执行当前协程所有defer延迟函数若无recover捕获程序直接崩溃退出打印堆栈信息三、recover 捕获 panic核心规则recover()只能写在defer 延迟匿名函数内部才生效无 panic 时recover()返回nil捕获到 panic 时返回 panic 传入的错误值阻断程序崩溃一次 defer 中调用一次 recover 即可重复调用无意义完整可运行案例数组越界 panic 自动恢复gopackage main import fmt func testb(x int) { // defer 匿名函数 内置recover捕获panic defer func() { // 接收panic信息 if err : recover(); err ! nil { fmt.Println(捕获到panic, err) } // recover() 无需重复调用 }() // 匿名函数立即注册到defer var arr [10]int arr[x] 111 // 越界触发panic fmt.Println(正常执行逻辑) } func main() { testb(20) // recover捕获panic后程序不会退出后续代码正常运行 fmt.Println(程序成功恢复继续执行main函数) }四、error vs panic 核心区分表格特性error普通错误panic恐慌异常使用场景可预期、业务常规错误致命、不可预期运行异常处理方式函数返回值手动判断err!nildeferrecover 捕获恢复程序行为不中断程序可继续运行无 recover 直接崩溃退出设计定位业务逻辑错误运行时严重 bug、非法操作使用建议接口参数校验、文件读写失败、数据库查询失败 →用 error 返回数组越界、非法内存操作、初始化严重失败等不可控异常 → panic recover 兜底五、完整整合可运行 Demo复制直接跑gopackage main import ( errors fmt ) // 1. error 示例除法 func MyDiv(a, b int) (int, error) { if b 0 { return 0, errors.New(分母不能为0) } return a / b, nil } // 2. panic recover 示例数组越界捕获 func arrayTest(x int) { defer func() { if err : recover(); err ! nil { fmt.Printf(捕获panic异常%v\n, err) } }() var arr [10]int arr[x] 999 fmt.Println(数组赋值成功) } func main() { // error测试 res, err : MyDiv(10, 0) if err ! nil { fmt.Println(除法错误, err) } else { fmt.Println(除法结果, res) } fmt.Println() // panic recover测试 arrayTest(20) fmt.Println(main函数执行完毕程序未崩溃) }总结error是接口两种生成方式errors.New/fmt.ErrorfGo 约定函数出错通过多返回值返回 error调用方必须判断panic 分为手动调用、运行时异常自动触发两种recover 必须写在 defer 匿名函数中否则无法捕获 panic业务优先 error底层严重异常使用 panicrecover 做容错兜底

相关新闻

最新新闻

什么是“效能度量”?研发团队千万别只盯代码行数

什么是“效能度量”?研发团队千万别只盯代码行数

全文阅读约6分钟 一、 权威开篇:当“度量”变成“误度量” LeadDev发布的《2025年工程团队绩效报告》对全球500余位工程领导者进行了调研,揭示了一个关键趋势:65%的工程领导者明确避免使用代码行数作为衡量指标,转而采用更能反映真…

2026/7/18 21:51:08
还在为开题报告头秃?这5个AI写作辅助网站让你效率翻倍!

还在为开题报告头秃?这5个AI写作辅助网站让你效率翻倍!

朋友们,写论文是不是让你抓狂?对着空白文档发呆、查重率压不下来、导师催稿催到心慌……别急!今天给大家推荐几款AI工具,只要用对了工具,真的能让你从焦虑中解脱! 不过先说清楚哈——AI不能替你写论文&…

2026/7/18 21:51:08
口碑好的西安锂电池源头厂家

口碑好的西安锂电池源头厂家

引言随着科技的飞速发展,锂电池在各个领域的应用愈发广泛,西安作为重要的科技产业基地,锂电池产业也颇具规模。在众多厂家中,找到口碑好的源头厂家至关重要。西安吉锂新能源科技有限公司便是其中备受关注的企业之一。西安锂电池行…

2026/7/18 21:51:08
点胶点钻机选型总踩坑?0.005mm重复定位精度如何实现?这份硬核指南讲透了

点胶点钻机选型总踩坑?0.005mm重复定位精度如何实现?这份硬核指南讲透了

从精度、工艺到稳定性,一套完整的技术评估框架一、引言:一个工程师的选型困境"参数表上都写着0.01mm,为什么实际干出来的活差了这么多?"这是我在一次行业交流中,听到一位电子制造企业的工艺工程师提出的问题…

2026/7/18 21:51:08
U-Boot 到底怎么切换升级分区?A/B 启动、环境变量与自动回滚 讲解

U-Boot 到底怎么切换升级分区?A/B 启动、环境变量与自动回滚 讲解

📺 B站 嵌入式孙老师:博主个人介绍 📘 博主书籍-京东购买链接*:Yocto项目实战教程 📘 加博主微信,进技术交流群: jerrydev U-Boot 到底怎么切换升级分区?A/B 启动、环境变量与自动…

2026/7/18 21:51:08
鸿蒙 PC Markdown 编辑器可靠性设计:未保存内容的崩溃恢复闭环

鸿蒙 PC Markdown 编辑器可靠性设计:未保存内容的崩溃恢复闭环

鸿蒙 PC Markdown 编辑器可靠性设计:未保存内容的崩溃恢复闭环 桌面编辑器的崩溃恢复不能只在启动时弹出一句“发现草稿”。可靠闭环必须回答:输入多久落一次恢复记录、连续输入是否造成高频全文写入、记录写到哪里、写一半进程退出会怎样、恢复后为什么…

2026/7/18 21:46:08

月新闻