1048 字
约 3 分钟
9
17. Go语言异常捕获
2026-09-25
无标签
  1. Go语言异常捕获 秀才 2025年2月14日 大约 4 分钟 Go语言 Go语言 golang go基础语法 异常捕获 此页内容 1. recover异常捕获 2. panic传递 1. recover异常捕获 异常其实就是指程序运行过程中发生了 panic ,那么我们为了不让程序报错退出,可以在程序中加入 recover 机制,将异常捕获,打印出异常,这样也方便我们定位错误。而捕获的方式我们之前在讲 defer 的时候也提到过,一般是用 recover 和 defer 搭配使用来捕获异常。 下面请看个具体例子:
func main() { 
 defer func() { 
 if error:=recover();error!=nil{ 
 fmt.Println("出现了panic,使用reover获取信息:",error) 
 } 
 }() 
 fmt.Println("11111111111") 
 panic("出现panic") 
 fmt.Println("22222222222") 
 }

运行结果:

11111111111
出现了panic,使用reover获取信息: 出现panic

注意 ,这里有了 recover 之后,程序不会在 panic 出中断,再执行完 panic 之后,会接下来执行 defer recover 函数,但是当前函数 panic 后面的代码不会被执行,但是调用该函数的代码会接着执行。 如果我们在 main 函数中未加入 defer func(){...} ,当我们的程序运行到底8行时就会 panic 掉,而通常在我们的业务程序中对于程序 panic 是不可容忍的,我们需要程序健壮的运行,而不是是不是因为一些 panic 挂掉又被拉起,所以当发生 panic 的时候我们要让程序能够继续运行,并且获取到发生 panic 的具体错误,这就可以用上述方法。 2. panic传递 当一个函数发生了 panic 之后,若在当前函数中没有 recover ,会一直向外层传递直到主函数,如果迟迟没有 recover 的话,那么程序将终止。如果在过程中遇到了最近的 recover ,则将被捕获。 看下面例子:

package main

import "fmt"

func testPanic1(){
 fmt.Println("testPanic1上半部分")
 testPanic2()
 fmt.Println("testPanic1下半部分")
}

func testPanic2(){
 defer func() {
 recover()
 }()
 fmt.Println("testPanic2上半部分")
 testPanic3()
 fmt.Println("testPanic2下半部分")
}

func testPanic3(){
 fmt.Println("testPanic3上半部分")
 panic("在testPanic3出现了panic")
 fmt.Println("testPanic3下半部分")
}

func main() {
 fmt.Println("程序开始")
 testPanic1()
 fmt.Println("程序结束")
}

运行结果:

程序开始
testPanic1上半部分
testPanic2上半部分
testPanic3上半部分
testPanic1下半部分
程序结束

解析: 调用链: main-->testPanic1-->testPanic2-->testPanic3 ,但是在 testPanic3 中发现了一个 panic ,由于 testPanic3 没有 recover ,向上找,在 testPanic2 中找到了 recover , panic 被捕获了,程序接着运行,由于 testPanic3 发生了 panic ,所以不再继续运行,函数跳出返回到 testPanic2 , testPanic2 中捕获到了 panic ,也不会再继续执行,跳出函数 testPanic2 ,到了 testPanic1 接着运行。 所以 recover 和 panic 可以总结为以下两点: recover() 只能恢复当前函数级或以当前函数为首的调用链中的函数中的 panic() ,恢复后调用当前函数结束,但是调用此函数的函数继续执行 函数发生了 panic 之后会一直向上传递,如果直至 main 函数都没有 recover() ,程序将终止,如果是碰见了 recover() ,将被 recover 捕获。 关注秀才公众号: IT杨秀才 ,领取精品学习资料 公众号后台回复: Go面试 ,领取Go面试题库PDF 公众号后台回复: Go学习 ,领取Go必看书籍 公众号后台回复: 大模型 ,领取大模型学习资料 公众号后台回复: 111 ,领取架构学习资料 公众号后台回复: 26届秋招 ,领取26届秋招企业汇总表

🔥 配套实战项目,拆得开、跑得起、能写进简历 多 Agent 编排 + RAG 混合检索 · 31 篇深度教程 + 50+ 面试题 点击查看 DevSupport AI 实战项目 → 在 GitHub 上编辑此页 上次编辑于: 2026/6/24 23:41:22 贡献者: Percygu , Your Name , gupeng 上一页 16. Go语言defer 下一页 18. Go语言依赖管理

17. Go语言异常捕获
https://clxhxhhr.top/posts/3615/
作者
clxstart
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。