浅谈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:获取并输出异常
相关文章
|
4月前
|
JavaScript 前端开发 Go
async 和 defer的作用与区别
async 和 defer的作用与区别
|
5月前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
47 0
|
5月前
|
Serverless Go
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
|
8月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
185 2
|
8月前
|
Go
Go语言中的异常处理:理解panic与recover
【2月更文挑战第7天】Go语言虽然以简洁和直接错误处理机制而著称,但它也提供了`panic`和`recover`这两个内置函数来处理程序中的异常情况。本文将深入探讨Go语言中的异常处理机制,包括`panic`和`recover`的使用场景、原理以及最佳实践,帮助读者更好地理解如何在Go中处理异常情况。
|
8月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
85 0
|
编译器 Go
Go学习笔记-defer、panic、recover分析
Go学习笔记-defer、panic、recover分析
95 1
Go学习笔记-defer、panic、recover分析
|
8月前
|
存储 编译器 Go
Golang底层原理剖析之panic与recover
Golang底层原理剖析之panic与recover
78 0
|
存储 Cloud Native Go
Go 语言中 panic 和 recover 搭配使用
Go 语言中 panic 和 recover 搭配使用
|
Go 数据库
Go语言学习之 panic 和 recover
Go语言学习之 panic 和 recover
49 0