Go语言-panic和recover使用实战
发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,panic正常的函数执行流程将立即终止,但函数中之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行panic()流程,直到所属的goroutine中所
千家信息网最后更新 2025年01月27日Go语言-panic和recover使用实战
panic
正常的函数执行流程将立即终止,但函数中之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行panic()流程,直到所属的goroutine中所有正在执行的函数将被终止。错误信息将被报告,包括panic()的参数类型interface()我们可以看到,panic可以接收任意类型的数据
panic(404)
panic("network borken")
panic("Error("file not exists")
recover
recover函数用于终止错误处理流程。recover应该在defer关键字的函数中执行以有效截取错误处理流程
实例1
package mainimport ( "fmt")func main() { defer func() { if r := recover(); r != nil { fmt.Println("detail:", r) } }() fmt.Println("before painc") panic("error1") panic("error2") fmt.Println("after panic") return}
运行结果
before paincdetail: error1
实例2
package mainimport ( "fmt")func main() { fmt.Println("before painc") panic("error1") panic("error2") fmt.Println("after panic") return}
运行结果
before paincpanic: error1goroutine 1 [running]:main.main() /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:17 +0xdd
实例3
package mainimport ( "fmt")func main() { defer func() { if r := recover(); r != nil { fmt.Println("detail:", r) } }() test() fmt.Println("end") return}func test() { defer func() { if r := recover(); r != nil { fmt.Println("detail0:", r) } }() fmt.Println("before painc") panic("error1") panic("error2") fmt.Println("after panic")}
运行结果
before paincdetail0: error1end
实例4
package mainimport ( "fmt")func main() { defer func() { if r := recover(); r != nil { fmt.Println("detail:", r) } }() test() fmt.Println("middle") panic("error3") fmt.Println("end") return}func test() { defer func() { if r := recover(); r != nil { fmt.Println("detail0:", r) } }() fmt.Println("before painc") panic("error1") panic("error2") fmt.Println("after panic")}
运行结果
before paincdetail0: error1middledetail: error3
实例5
package mainimport ( "fmt")func main() { test() fmt.Println("middle") panic("error3") fmt.Println("end") return}func test() { fmt.Println("before painc") panic("error1") panic("error2") fmt.Println("after panic")}
运行结果:
before paincpanic: error1goroutine 1 [running]:main.test() /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:20 +0xddmain.main() /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:10 +0x26
函数
实例
结果
运行
流程
错误
关键
关键字
类型
处理
有效
信息
参数
所属
报告
数据
正在
语句
延迟
实战
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
陕西安卓软件开发服务商
深圳服务器散热器订制
网络安全开展两学两保
服务器冷启动
老河口天气预报软件开发
改变数据库排序规则
合肥5福网络技术有限公司
五华区创新软件开发市场价
打印机服务器搜不到怎么办
手机玩1.16版拔刀剑服务器
服务器安装瑞星杀毒软
sql数据库书籍资料下载
外国网络安全局局长
阿里云数据库密码
可控性是网络安全的主要特性吗
最急需的网络安全
单元格引用到另一列数据库
北京智珠网络技术有限公司注册
网络安全系统更新
合阳天气预报软件开发
qq邮箱登录提示网络安全
数据库脚本怎样
数据库数据替换内容吗
服务器上有固态和机械硬盘
中国的网络安全产业
什么数据库适合高更新
数据库汇总啥意思
拆分盘可以加入数据库吗
数码数据库
淄川工具软件开发报价