1. panic:

一般表示程序出现了严重故障,此时程序不能继续运行,比如服务挂了...

产生方式/场景
(1) 主动调用:通过 panic() 函数;
(2) 被动调用:panic产生后,会将堆栈信息抛出来,方便定位问题。
例如:程序在运行阶段发生了内存异常操作,例如:空指针的取值,索引越界,栈溢出改写只读内存... 等等(还有其他情况会导致panic,借鉴简书大佬的链接:Go 常见的引发 panic 的情况)

注意点:
1. panic 其实是一个终止函数栈执行的过程,但是在函数退出前都会执行defer里面的函数,直到所有的函数都退出后,才会执行panic

2. recover:

recover是go提供的一个用来截获 panic 信息,重新获取协程控制的函数。

使用要求
1)recover必须在defer函数中使用,但是不能被 defer 直接调用,如:

defer recover() // 直接调用,这样的写法不能恢复panic

2)recover只能恢复同一个协程中的panic,所以必须与可能发生panic的协程在同一个协程中才生效
错误示例:
panic在子协程中,而recover在主协程中,recover不能跨协程捕获panic信息,最终会导致所有的协程全部挂掉,程序会整体退出

package mainimport ("fmt""runtime/debug""time"
)// 错误示例:recover不能跨协程捕获panic信息
func Test() {panic("Test(): 我异常了...溜了溜了")
}func main() {defer func() {err := recover(); if err != nil {debug.PrintStack()//fmt.Println(string(debug.Stack()))}}()go Test() // recover不能跨协程捕获// Test()time.Sleep(5 * time.Second) // 模拟执行耗时任务(顺便等待子协程执行)fmt.Println("main()不能正常执行...") // panic后,主协程main()无法继续正常执行打印
}

错误示例 - 运行结果:

正确示例:

package mainimport ("fmt""runtime/debug""time"
)// 正确示例:
func Test() {defer func() {if err := recover(); err != nil {debug.PrintStack()//fmt.Println(string(debug.Stack()))}}()panic("Test(): 我异常了...溜了溜了")
}func main() {go Test()// Test()time.Sleep(5 * time.Second)       // 模拟执行耗时任务(顺便等待子协程执行)fmt.Println("main()依然是能正常执行的...") // 可以正常打印,即使Test()发生panic
}

正确示例 - 运行结果:

3. 函数panic后,打印堆栈调用信息:

程序发生panic后,可以将堆栈信息打印出来,方便定位问题:

debug.PrintStack() 或 fmt.Println(string(debug.Stack()))

注意点:

1. 正确使用recover(),要记住recover只能恢复当前协程的panic,否则还是会导致整个进程挂掉
2. recover并非万能的,它只对用户态下的panic关键字有效

实际上在Go语言中,是存在着一些无法恢复的“恐慌”事件的,如fatalthrow方法、fatalpanic方法等,这些都是直接通过调用 exit() 方法进行中断的,属于无法恢复的“恐慌”事件,比如:
对于go1.6以上版本,如果出现 并发map读写 程序会直接以 fatal error 崩溃,即使在同一个协程内有recover()也不能恢复

  • 如果map由多协程同时读和写就会出现 fatal error:concurrent map read and map write 的错误
  • 多个协程同时写会出现 fatal error: concurrent map writes 的错误

我写博客是真的慢...写了好久~

Go panic recover 使用注意点:相关推荐

  1. go panic recover 异常处理

    go panic recover 异常处理 参考文章: (1)go panic recover 异常处理 (2)https://www.cnblogs.com/zhishuai/p/8043064.h ...

  2. Go的异常处理 defer, panic, recover

    Go的异常处理 defer, panic, recover 参考文章: (1)Go的异常处理 defer, panic, recover (2)https://www.cnblogs.com/ghj1 ...

  3. go中宕机与恢复 panic/recover 介绍

    目录 一.panic 宕机 二.recover恢复 三.panic和recover的关系 Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失.Go 语言程 ...

  4. Go-defer,panic,recover

    defer 语法: defer function_name() 简单来讲,在defer所在函数执行完所有的代码之后,会自动执行defer的这个函数. 示例一(基本功能) package main im ...

  5. go defer,panic,recover详解 go 的异常处理

    golang中defer,panic,recover是很常用的三个特性,三者一起使用可以充当其他语言中try-catch-的角色,而defer本身又像其他语言的析构函数 defer defer后边会接 ...

  6. Go案例说明defer panic recover

    defer推迟  recover恢复  panic恐慌 通过一个案例解释:发送邮件的 发送不成功要修改数据表的邮件发送状态值 发送邮件的内部sendEmail出现错误  要去修改数据表的状态值了 发送 ...

  7. Go: panic / recover 简介与实践

    文章目录 简介 1.特性 2.panic触发流程 3.recover使用要点 4.使用场景 一.实践 1.跨线程失效 2.不起作用的recover 3.嵌套使用panic 4.注意事项 小结 简介 g ...

  8. go 异常捕获和处理(panic/recover)

    异常处理 Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误. 异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个 ...

  9. golang panic recover return defer的逻辑顺序问题

    package mainimport "fmt"//验证golang return defer recover 之间的顺序关系func main() {defer func() { ...

  10. go panic recover 思考

    panic 作为 Go 异常的一种,类比其它语言的 Exception. 常见的 panic 有数组下标越界,或者除数为0,这类 panic 可以通过 recover 进行捕获.但要特别注意,程序发生 ...

最新文章

  1. MySQL Proxy实现数据库读写分离
  2. 冯诺依曼计算机程序及其执行,第4章冯.诺依曼计算机:机器级程序与其执行练习题答案解析...
  3. 移动端H5页面高清多屏适配方案
  4. 算法-Valid Anagram
  5. centos7.0 没有netstat 和 ifconfig命令问题
  6. activiti动态增加节点_图神经网络之动态图
  7. WARNING: IPv4 forwarding is disabled. Networking will not work.
  8. powershell 模拟IE行为
  9. qq表情左右滑动php,基于jQuery实现的QQ表情插件_jquery
  10. 强大的Bigdecimal
  11. html 加爱心符号,爱心符号大全
  12. 怎么查看自己电脑的iP地址,3个方法推荐
  13. js 调用 百度/腾讯/高德地图app 导航 初始位置为我的位置
  14. 《蛋仔派对》通关小技巧
  15. 根据年份和月份来计算天数
  16. STM32F03寄存器方式点亮LED流水灯
  17. java 获取系统的时区_【转】Java 获取操作系统时区
  18. 基于kali2020环境,熟悉数据库服务的部署及基本验证方法及访问数据库
  19. gerber转pcb步骤与方法
  20. 事业单位人事招聘考务管理系统+功能介绍+HRSaaS软件系统服务平台+系统5.0版升级上线

热门文章

  1. 华为荣耀9手机屏幕及电池更换
  2. HTML5音乐播放器
  3. 那些高中辍学的人,现在怎么样了?后悔吗?
  4. 怎么用cmd命令编译执行java程序
  5. [BZOJ1038]ZJOI2008瞭望塔|半平面交
  6. 宏碁蜂鸟・未来笔记本:国家地理环保联名版 评测
  7. Gammatone滤波器组
  8. 特斯拉4万亿美元的【市值目标】将是一个巨大的危险信号
  9. 在官网下载各种JDK版本
  10. 乐max显示无服务器,iPhone XS无服务怎么办 苹果XS MAX无服务解决方法