腥风血雨中,这招救了我的代码!

简介: 腥风血雨中,这招救了我的代码!

/ Go 语言 recover 避免程序宕机详解 /

Go 语言中可以通过 recover 机制来防止程序崩溃,本文将通过完整的示例详细介绍 recover 的用法。本文主要内容

  1. recover 基本用法
  2. 错误处理
  3. 重新 panic
  4. 多层 recover
  5. 与错误处理结合

1

 

一、recover 基本用法

recover 可以捕获 panic,示例:

func main() {
  defer func() {
    fmt.Println("Recover: ", recover()) // 捕获panic信息
  }()
  panic("Crash") // 触发panic
}

输出:

Recover:  Crash

defer 延迟执行 recover,捕获到 panic 参数。

2

 

二、错误处理

可以根据 recover 结果进行错误处理:

func main() {
  defer func() {
    r := recover()
    if r != nil {
      fmt.Println("Recovered from panic: ", r)
    }
  }()
  panic(123)
}

输出:

Recovered from panic:  123

根据 recover 的参数进行处理。

3

 

三、重新 panic

也可以在 recover 后重新 panic:

func main() {
  defer func() {
    if r := recover(); r != nil {
       fmt.Println("Recovered: ", r)
       panic(r) // 重新panic
    }
  }()
  panic(123)
}

输出:

Recovered:  123
panic: 123

根据情况选择是否重新 panic。

4

 

四、多层 recover

通过多层 defer 可以多次 recover:

func main() {
  defer func() { 
    if r := recover(); r != nil {
      fmt.Println("Recovered 1: ", r)
    }
  }()
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered 2: ", r)
    }
  }()
  panic(123)
}

输出:

Recovered 2:  123
Recovered 1:  123  

多层 defer 实现多次 recover。

5

 

五、与错误处理结合

recover 要与错误处理结合使用:

if err := dangerous(); err != nil {
  // 错误处理 
}
func dangerous() (err error) {
  defer func() {
    if r := recover(); r != nil {
      err = r.(error) // 转换为error类型
    }
  }()
  // 可能引起panic的代码
  return
}

常规错误用 err,不可恢复错误用 panic+recover。

6

 

六、总结

recover 机制可以有效防止 Go 程序完全崩溃,与错误处理配合使用可以提高程序健壮性。

综上所述,详细介绍了如何通过 recover 机制避免 Go 程序崩溃,可以帮助大家更好地处理 Go 程序中的 panic 问题。


目录
相关文章
|
JSON 前端开发 JavaScript
【面试题】 面试官:你如何实现大文件上传
【面试题】 面试官:你如何实现大文件上传
169 0
|
存储 应用服务中间件 API
MinIO 参数解析与限制
MinIO 参数解析与限制 MinIO server 在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json 文件中。 以下部分提供每个字段的详细说明以及如何自定义它们。
5834 0
|
9月前
|
Python
Python量化炒股的获取数据函数—get_index_weights()
Python量化炒股的获取数据函数—get_index_weights()
87 0
|
11月前
|
JSON 编解码 物联网
理解时间戳的视频理解大模型CogVLM2开源!视频生成、视频摘要等任务有力工具!
随着大型语言模型和多模态对齐技术的发展,视频理解模型在通用开放领域也取得了长足的进步。
|
11月前
|
XML 监控 Java
Spring框架的核心原理与应用实践
Spring框架的核心原理与应用实践
|
11月前
|
安全 Java API
【新手必看】服务端集成网易云信IM 即时通讯
【新手必看】服务端集成网易云信IM 即时通讯
419 0
|
安全 测试技术 网络安全
基于计算机网络的毕业设计 - 实现高效网络服务与安全通信
本毕业设计旨在利用计算机网络技术设计并实现一个综合性系统,以解决特定领域的问题或提供特定的服务。设计包括网络通信协议的优化、网络安全机制的设计、数据传输与处理的优化以及用户界面设计等方面。通过本设计,旨在提高学生对计算机网络及相关技术的理解和应用能力,并为用户提供高效、可靠的网络服务。
180 0
|
机器学习/深度学习 人工智能 安全
深度学习在图像识别中的创新应用
随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的关键力量。本文将探讨深度学习在图像识别领域的最新进展,并重点分析卷积神经网络(CNN)和循环神经网络(RNN)在提高图像识别准确性方面的创新方法。通过引入注意力机制、生成对抗网络(GANs)以及迁移学习等前沿技术,文章揭示了如何有效提升模型的泛化能力和识别效率。此外,文中还将讨论深度学习在现实世界中遇到的挑战和未来的发展趋势。
|
JSON 前端开发 Java
Validated、Valid 、Validator,他们的区别你知道几个
对于任何基本验证,我们将在方法调用中使用 JSR @Valid注释。另一方面,对于任何组验证,包括组序列,我们需要 在我们的方法调用中使用 Spring 的@Validated注释。
Validated、Valid 、Validator,他们的区别你知道几个
|
XML JSON NoSQL
Redis - RedisTemplate及4种序列化方式深入解读
Redis - RedisTemplate及4种序列化方式深入解读
1817 0