浅谈defer、panic、recover 三者的用法

举报
海风极客 发表于 2022/10/18 22:36:16 2022/10/18
【摘要】 1 Go的异常处理机制的引入go的异常是一个interface类型type error interface { Error() string}并且是可输出的func methodA() { var err error fmt.Println(err)}func main() { methodA()}但是我们一般用panic函数进行捕获func methodA() { v...

1 Go的异常处理机制的引入

go的异常是一个interface类型

type error interface {
   Error() string
}

并且是可输出的

func methodA() {
   var err error
   fmt.Println(err)
}

func main() {
   methodA()
}

在这里插入图片描述
但是我们一般用panic函数进行捕获

func methodA() {
   var err error
   fmt.Println(err)
   panic(err)
   fmt.Println(err)
}

func main() {
   methodA()
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrSSZHTY-1646469183671)(浅谈defer、panic、recover 三者的用法.assets/image-20220305155434559.png)]
这样的做法就会导致一个问题,那就是程序崩溃,不能向下进行继续的处理和异常的返回,因此我们必须有一个良好的异常处理机制进行对error类型的合理输出和处理。

由此,我们引入了defer+panic+recover进行Go程序异常处理

2 defer用法

defer函数类似于一个栈,常用于对流操作的close操作,具体演示下就知道了:

func def() {
   a := func() {
      fmt.Println("A")
   }
   b := func() {
      fmt.Println("B")
   }
   c := func() {
      fmt.Println("C")
   }
   defer c()
   defer b()
   defer a()
}

func main() {
   def()
}

执行结果:
在这里插入图片描述

3 panic和recover用法

为什么将这两个函数放在一起说呢,因为他们两个就相当于Java中的throw和try{...}catch{...}联合进行异常的捕获和处理,示例:

func a() {
   defer func() {
      r := recover()
      fmt.Println("panic recover", r)
   }()
   panic(1)
}

func main() {
   defer func() {
      r := recover()
      fmt.Println("main recover", r)
   }()
   a()
   fmt.Println("main")
   def()
}

在这里插入图片描述

4 总结

  • defer:异常时函数结束返回
  • panic:自定义抛出异常
  • recover:获取并输出异常
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。