当前位置: 首页 > news >正文

Go 语言 panic 和 recover 详解

panic() 和 recover() 是 Go 语言中用于处理错误的两个重要函数。panic() 函数用于中止程序并引发panic,而 recover() 函数用于捕获panic并恢复程序的执行。

什么是panic和recover?

panic

  • panic() 函数用于中止程序并引发panic。
  • panic() 函数可以接收一个参数,该参数将作为panic的原因。
  • 当发生panic时,程序将停止执行,并开始寻找最近的recover调用。
  • 如果找不到recover调用,程序将打印panic的原因并退出。

recover

  • recover() 函数用于捕获panic并恢复程序的执行。
  • recover() 函数可以接收一个参数,该参数将存储panic的原因。
  • 如果在发生panic时调用了recover,程序将继续执行,并且panic的原因将被存储在recover的第一个参数中。
func main() {defer func() {err := recover()if err != nil {fmt.Println("panic:", err)}}()panic("hello, panic!")
}

panic 的传播

 panic 函数会向上传播到调用它的 goroutine。如果 panic 函数没有被捕获,则会一直向上传播,直到遇到 defer 语句中调用的 recover() 函数,或者程序退出。

注意事项

跨协程失效

panic 和 recover 不能跨协程使用。这意味着在一个协程中发生的panic只能在同一个协程中通过 recover 捕获。如果在一个协程中发生了panic,而在另一个协程中调用了 recover,那么 recover 将无法捕获panic。参考如下代码:

func main() {defer println("in main")go func() {defer println("in goroutine")panic("")}()time.Sleep(1 * time.Second)
}

失效的崩溃恢复

如果在一个defer函数中发生了panic,那么该defer函数后面的语句将不会被执行。这意味着在defer函数中使用 recover 来捕获panic是无效的。

func main(){defer fmt.Println("main....")defer func() {err := recover()if err != nil {fmt.Println("panic:", err)}}()panic("hello, panic!")
}

嵌套崩溃

嵌套崩溃是指在一个 goroutine 中调用 panic() 函数,然后在 defer 语句中再次调用 panic() 函数。在这种情况下,panic() 函数会从内向外传播,直到程序崩溃。嵌套崩溃可能会导致程序不可用,因此应避免使用。

func multiplePanic() {defer fmt.Println("in defer")defer func() {defer func() {panic("panic 3")}()panic("panic 2")}()panic("panic 1")
}

http://www.lryc.cn/news/278974.html

相关文章:

  • NAND Separate Command Address (SCA) 接口数据传输解读
  • 彻底认识Unity ui设计中Space - Overlay、Screen Space - Camera和World Space三种模式
  • 档案数字化怎样快速整理资料
  • 面试算法100:三角形中最小路径之和
  • androj studio安装及运行源码
  • 【Web】token机制
  • JVM 11 调优指南:如何进行JVM调优,JVM调优参数
  • 横版动作闯关游戏:幽灵之歌 GHOST SONG 中文版
  • 【C++】:C++中的STL序列式容器vector源码剖析
  • final
  • 【AI】ObjectCenteredSensing
  • 一阶低通滤波器
  • 【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
  • Unity中向量的点乘、叉乘区别和作用以及经典案例
  • (26)Linux 进程通信之共享内存(共享储存空间)
  • 体感游戏开发体感互动游戏
  • vulnhub靶场之DC-5
  • 为什么选择CRM系统时,在线演示很重要?
  • 专业实习day3、4(路由器做内网访问公网)
  • H264码流进行RTP包封装
  • 基于多智能体点对点转换的分布式模型预测控制
  • 性能分析与调优: Linux 实现 缺页剖析与火焰图
  • 代码随想录算法训练营第17天 | 110.平衡二叉树 + 257. 二叉树的所有路径 + 404.左叶子之和
  • ubuntu20.04网络问题以及解决方案
  • Java面试题(java高级面试题)
  • 【MIdjourney】关于图像中人物视角的关键词
  • 433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)
  • MYSQL双主节点–更换ip
  • 一文玩转Go语言中的面向对象编程~
  • kylin集群反向代理(健康检查)