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

简介: 浅谈defer、panic、recover 三者的用法

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()
}
复制代码

网络异常,图片无法展示
|


这样的做法就会导致一个问题,那就是程序崩溃,不能向下进行继续的处理和异常的返回,因此我们必须有一个良好的异常处理机制进行对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:获取并输出异常


相关文章
|
3月前
|
JavaScript 前端开发 Go
async 和 defer的作用与区别
async 和 defer的作用与区别
|
4月前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
39 0
|
4月前
|
Serverless Go
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
|
7月前
|
Go
Go语言中的异常处理:理解panic与recover
【2月更文挑战第7天】Go语言虽然以简洁和直接错误处理机制而著称,但它也提供了`panic`和`recover`这两个内置函数来处理程序中的异常情况。本文将深入探讨Go语言中的异常处理机制,包括`panic`和`recover`的使用场景、原理以及最佳实践,帮助读者更好地理解如何在Go中处理异常情况。
|
7月前
|
Java Go
浅谈defer、panic、recover 三者的用法
浅谈defer、panic、recover 三者的用法
44 0
|
7月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
79 0
|
编译器 Go
Go学习笔记-defer、panic、recover分析
Go学习笔记-defer、panic、recover分析
90 1
Go学习笔记-defer、panic、recover分析
|
7月前
|
存储 编译器 Go
Golang底层原理剖析之panic与recover
Golang底层原理剖析之panic与recover
71 0
|
存储 Cloud Native Go
Go 语言中 panic 和 recover 搭配使用
Go 语言中 panic 和 recover 搭配使用
|
Go 数据库
Go语言学习之 panic 和 recover
Go语言学习之 panic 和 recover
41 0