Go语言recover
在 Go 语言 中,如果我们的函数或者程序出现了非常严重的问题,或者说我们的程序遇到了 panic 异常,此时我们的程序会终止运行。
但是,我们希望我们程序在发生错误后,我们能够做一些处理,保证程序可以继续运行,那么这时候,我们就需要使用异常恢复,即 recover。Golang 中的 recover 一般都是配套 defer 一起使用。
例:
defer func() {if r := recover(); r != nil {fmt.Println("Recovered in f", r)}
}()
panic和recover使用原则:
- defer 需要放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。
- recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。
- 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用
panic与recover的关系:
如果有 panic 但没有 recover,那么程序会宕机。如果有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。虽然 panic/recover 能模拟其他语言的异常机制,但并不建议在编写普通函数时也经常性使用这种特性。在 panic 触发的 defer 函数内,可以继续调用 panic,进一步将错误外抛,直到程序整体崩溃。
案例1:
package main
import "fmt"
func main() {defer func() {if info := recover(); info != nil {fmt.Println("panic happened, Info =", info)} else {fmt.Println("normally exit")}}()panic("fatal error")fmt.Println("continue...")
}
案例2: recover 捕获异常
package main
import ("fmt""time"
)
func main() {f()fmt.Println("end")
}
func f() {defer func() {fmt.Println("defer start")if err := recover(); err != nil {fmt.Println(err)}fmt.Println("defer end")}()for {fmt.Println("func begin")a := []string{"a", "b"}fmt.Println(a[3])fmt.Println("func end")time.Sleep(1 * time.Second)}
}
案例3 : 在defer中继续抛出错误
package main
import ("fmt""time"
)
func main() {f()fmt.Println("end")
}
func f() {defer func() {fmt.Println("defer2 start")if err := recover(); err != nil {fmt.Println(err)}fmt.Println("defer2 end")}()defer func() {fmt.Println("defer1 start")if err := recover(); err != nil {panic(err)}fmt.Println("defer1 end")}()for {fmt.Println("func begin")a := []string{"a", "b"}fmt.Println(a[3])fmt.Println("func end")time.Sleep(1 * time.Second)}
}
Go语言recover相关推荐
- c语言recover函数的功能是,c语言实验报告(附答案版).doc
c语言实验报告(附答案版) 实验 一.实验学时二.实验目的1. (2)掌握不同的类型数据之间赋值的规律: (3)掌握数据在内存中的存储方式: (4)学会输入.输出函数的基本格式和使用方法: (5)学会 ...
- go语言 recover
就是try package mainimport "fmt"func demo(i int) {//错误拦截到出现在错误之前defer func() {err := recover ...
- amis eureka_如何构建量身定制的amis来升级您的基础架构
amis eureka There comes a time in everyone's infrastructure journey that you have to build your own ...
- 前端工程师 后段工程师_如何像工程师一样思考
前端工程师 后段工程师 In my time in the tech field, I have learned that it really doesn't matter what tools or ...
- recover 没有捕获异常_GO语言异常处理机制panic和recover分析
本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...
- Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件
文章目录 31-自定义错误 使用 New 函数创建自定义错误 使用 Errorf 给错误添加更多信息 使用结构体类型和字段提供错误的更多信息 使用结构体类型的方法来提供错误的更多信息 32-panic ...
- Go 语言踩坑记——panic 与 recover
题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...
- GO语言之recover
运行panic异常一旦被引发就会导致程序崩溃,这当然不是我们愿意看到的,go语言提供乐专用于"拦截"运行时panic的内建函数-recover,它可以是当前的程序从运行时p ...
- 贝壳一键还原2.0(BeiKel One Key Recover 2.0)多语言版下载(简体中文,繁体中文,英文)
贝壳一键还原2.0(BeiKel One Key Recover 2.0)多语言版提供下载. 程序启动后可以选择语言,默认是简体中文 下载地址:http://u.115.com/file/f3f5a6 ...
最新文章
- Android中网络使用
- 批量启动关闭MS SQL 2005服务BAT
- Feature Pyramid Networks for Object Detection 总结
- php如何给数组取名,给表单取名可以为数组,并且可以通过php打印出来
- 内存泄露从入门到精通三部曲之排查方法篇
- 《Servlet学习笔记》Servlet开发细节-线程安全
- 力扣836.矩形重叠
- MyEclipse 10的使用技巧
- 【SpringMVC笔记】拦截器 + 文件上传下载
- 好消息,MaxtoCode 1.10 已经封包,待2005.5.5日发布(如果有Bug将在1.20改正)
- Linux下安装和配置JDK与Tomcat(升级版)
- 这 173 家牛逼的互联网国企!值得你加入
- sketch插件的学习 末尾链接有彩蛋
- j2cache多级缓存
- ijkplayer 代码走读之 播放器网络数据读取过程详解2
- hive建表(一)创建外部表
- 初入Java,安装jdk,ij编译,运行
- 【转】ASP六大对象介绍
- 小小的面试二分题目,竟然暗藏玄机?
- 连接Linux服务器下Oracle数据库提示:ORA-12541: TNS: 无监听程序