请选择 进入手机版 | 继续访问电脑版

[Golang] golang panic及处理机制

[复制链接]
查看168 | 回复49 | 2021-9-15 02:16:27 | 显示全部楼层 |阅读模式
目次

一 panic机制

  panic会将这个非常 不断向上抛出,直到有地方处理它,假如 有处理,则不会再向上抛出。倘若没有处理,那么终极 会导致main挂掉.

  1.  golang虽然没有try catch机制,却有一种类似的recover机制,后续demo我们可以观测到它的用法和作用
复制代码

二 实例   

2.1 main用recover

  1. func main() {
  2. defer func() {
  3. if err := recover(); err != nil {
  4. log.Println("err:", err)
  5. }
  6. }()
  7. go test1()
  8. time.Sleep(time.Second * 3)
  9. panic(errors.New("stop test1"))
  10. log.Println("123")
  11. select {}
  12. }
  13. func test1() {
  14. for {
  15. tm := time.NewTicker(time.Second)
  16. select {
  17. case <-tm.C:
  18. log.Println("test1")
  19. }
  20. }
  21. }
复制代码

golang panic及处理机制

2.2 func用recover

  1. func main() {
  2. defer func() {
  3. if err := recover(); err != nil {
  4. log.Println("err:", err)
  5. }
  6. }()
  7. go test1()
  8. time.Sleep(time.Second * 3)
  9. makeerr()
  10. log.Println("123")
  11. select {}
  12. }
  13. func test1() {
  14. for {
  15. tm := time.NewTicker(time.Second)
  16. select {
  17. case <-tm.C:
  18. log.Println("test1")
  19. }
  20. }
  21. }
  22. func makeerr() {
  23. defer func() {
  24. if err := recover(); err != nil {
  25. log.Println("makeerr:", err)
  26. }
  27. }()
  28. panic(errors.New("stop"))
  29. }
复制代码

golang panic及处理机制

  1. 此时我们在func中用recover,那么挂掉的只是func,他不会抛到main中,所以main能继续运行,继而main开辟的go test1也能继续运行
复制代码

2.3 func用recover且开创goroutine

  1. func main() {
  2. defer func() {
  3. if err := recover(); err != nil {
  4. log.Println("err:", err)
  5. }
  6. }()
  7. time.Sleep(time.Second * 3)
  8. makeerr()
  9. log.Println("123")
  10. select {}
  11. }
  12. func test1() {
  13. for {
  14. tm := time.NewTicker(time.Second)
  15. select {
  16. case <-tm.C:
  17. log.Println("test1")
  18. }
  19. }
  20. }
  21. func makeerr() {
  22. defer func() {
  23. if err := recover(); err != nil {
  24. log.Println("makeerr err:", err)
  25. }
  26. }()
  27. go test1()
  28. panic(errors.New("stop test"))
  29. }
复制代码

golang panic及处理机制

  1. 我们发现,func虽然挂掉了,但是他开创的go没挂掉,因为即使是这个函数退出了,新开的协程是相当于基于main下的一个子程,只要main不退出,他依然会“存活”
复制代码

2.4 goroutine中panic

  1. func main() {
  2. defer func() {
  3. if err := recover(); err != nil {
  4. log.Println("err:", err)
  5. }
  6. }()
  7. go test1()
  8. time.Sleep(time.Second * 3)
  9. log.Println("123")
  10. select {}
  11. }
  12. func test1() {
  13. log.Println("test1 start")
  14. panic(errors.New("stop test1"))
  15. log.Println("test1 end")
  16. }
复制代码

golang panic及处理机制

  1. 协程中如果没recover,那么error就会抛向main,main就会挂掉,从而没有执行到后面的log打印。
  2. ---> 这种情况,main中做defer recover是没用的
复制代码

2.5 func1内嵌func2中panic且func2做处理

  1. func main() {
  2. test1()
  3. time.Sleep(time.Second * 3)
  4. log.Println("123")
  5. }
  6. func test1() {
  7. log.Println("test1 start")
  8. test2()
  9. log.Println("test1 end")
  10. }
  11. func test2() {
  12. defer func() {
  13. if err := recover(); err != nil {
  14. log.Println("test2 err:", err)
  15. }
  16. }()
  17. log.Println("test2 start")
  18. panic(errors.New("stop test2"))
  19. log.Println("test2 end")
  20. }
复制代码

golang panic及处理机制

2.6 func1内嵌func中panic且func1做处理

  1. func main() {
  2. test1()
  3. time.Sleep(time.Second * 3)
  4. log.Println("123")
  5. }
  6. func test1() {
  7. defer func() {
  8. if err := recover(); err != nil {
  9. log.Println("test? err:", err)
  10. }
  11. }()
  12. log.Println("test1 start")
  13. test2()
  14. log.Println("test1 end")
  15. }
  16. func test2() {
  17. log.Println("test2 start")
  18. panic(errors.New("stop test2"))
  19. log.Println("test2 end")
  20. }
复制代码

golang panic及处理机制

  1. func2异常,执行终止,向调用者func1抛出进而本身退出,func1得到异常,执行终止,本身退出时recover进行处理,从而保活了main
复制代码

到此这篇关于golang panic及处理机制的文章就先容 到这了,更多干系 golang panic内容请搜索 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 飞儿506 | 2021-9-25 07:08:50 | 显示全部楼层
收藏了,很不错的内容!
回复

使用道具 举报

avatar 梦的衣裳323 | 2021-9-28 22:47:01 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

avatar 风来时狂放 | 2021-10-1 12:58:36 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 123457468 | 2021-10-1 22:16:40 | 显示全部楼层
这个帖子好无聊啊!
回复

使用道具 举报

avatar 啵啵小奥特 | 2021-10-6 06:03:33 | 显示全部楼层
楼上的能详细介绍一下么?
回复

使用道具 举报

avatar 擎宇温 | 2021-10-8 21:33:06 | 显示全部楼层
好无聊啊!
回复

使用道具 举报

avatar 落日余晖97 | 2021-10-10 22:15:50 | 显示全部楼层
没人理我,好伤心啊!
回复

使用道具 举报

avatar 眠眠不觉量 | 2021-10-13 00:24:46 | 显示全部楼层
看帖不回帖的人就是耍流氓,我回复了!
回复

使用道具 举报

avatar 123457176 | 2021-10-13 01:07:05 | 显示全部楼层
青春不在了,青春痘还在!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则