Go语言中的recover()函数用法解读

作者:

文章目录
  • 必须与 defer 配合使用:只有在 defer 函数中直接调用才有效 作用域限制:只能恢复同一个 goroutine 中的 panic Go 1.21 的变化: 之前版本:panic(nil) 时 recover() 返回 nil Go 1.21+:panic(nil) 会引发 runtime panic,recover() 返回 *runtime.PanicNilError
  • 不要滥用 recover:应该只用于处理真正的意外情况,而不是替代常规错误处理 资源清理:即使 panic 被 recover,defer 函数仍然会执行 跨 goroutine:无法恢复其他 goroutine 的 panic 性能影响:panic/recover 比常规错误处理机制性能差
  • recover() 和 panic() 是配套使用的: func doSomething() { defer func() { if r := recover(); r != nil { fmt.Println(“Recovered:”, r) } }() if somethingWrong { panic(“critical error”) } }
  • 为关键代码段添加 recover 记录 recover 到的错误信息 尽量让程序在 recover 后能继续正常运行 避免在库函数中静默地 recover 而不返回错误
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Go语言中Recover机制的使用 Go语言异常处理error、panic、recover的使用 Go语言panic和recover的用法实例 Go语言异常处理(Panic和recovering)用法详解 Go语言使用defer+recover解决panic导致程序崩溃的问题
  • 目录
    • 基本概念
      • 1. 函数签名
      • 2. 核心功能
    • 工作原理
      • 1. 使用位置
      • 2. 返回值
    • 使用示例
      • 基本用法
      • 实际应用场景
    • 重要特性
      • 注意事项
        • 与 panic 的关系
          • 最佳实践
            • 总结

              recover() 是 Go 语言中用于处理 panic 的内置函数,它允许程序管理发生 panic 的 goroutine 的行为。

              下面我将详细解释它的工作原理和使用方法。

              func recover() any
              

              recover() 可以:

              • 停止 panic 的传播
              • 返回传递给 panic() 的值
              • 恢复正常的程序执行

              recover() 必须在 defer 函数中直接调用才有效:

              defer func() {
                  if r := recover(); r != nil {
                      // 处理 panic
                  }
              }()
              

              • 当 goroutine 正在 panic 且在 defer 函数中调用时:返回传递给 panic() 的值
              • 其他情况(包括 panic 参数为 nil 的情况,Go 1.21 之前):返回 nil

              func mayPanic() {
                  panic("something went wrong")
              }
              
              func main() {
                  defer func() {
                      if r := recover(); r != nil {
                          fmt.Println("Recovered from panic:", r)
                      }
                  }()
                
                  mayPanic()
                  fmt.Println("This will not be executed if panic occurs")
              }
              

              输出:Recovered from panic: something went wrong

              func safeDivide(a, b int) (result int, err error) {
                  defer func() {
                      if r := recover(); r != nil {
                          err = fmt.Errorf("runtime error: %v", r)
                      }
                  }()
                
                  return a / b, nil
              }
              

              必须与 defer 配合使用:只有在 defer 函数中直接调用才有效

              作用域限制:只能恢复同一个 goroutine 中的 panic

              Go 1.21 的变化

              • 之前版本:panic(nil)recover() 返回 nil
              • Go 1.21+:panic(nil) 会引发 runtime panic,recover() 返回 *runtime.PanicNilError

              1. 不要滥用 recover:应该只用于处理真正的意外情况,而不是替代常规错误处理
              2. 资源清理:即使 panic 被 recover,defer 函数仍然会执行
              3. 跨 goroutine:无法恢复其他 goroutine 的 panic
              4. 性能影响:panic/recover 比常规错误处理机制性能差

              recover()panic() 是配套使用的:

              func doSomething() {
                  defer func() {
                      if r := recover(); r != nil {
                          fmt.Println("Recovered:", r)
                      }
                  }()
                
                  if somethingWrong {
                      panic("critical error")
                  }
              }
              

              1. 为关键代码段添加 recover
              2. 记录 recover 到的错误信息
              3. 尽量让程序在 recover 后能继续正常运行
              4. 避免在库函数中静默地 recover 而不返回错误

              以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

              您可能感兴趣的文章:

              • Go语言中Recover机制的使用
              • Go语言异常处理error、panic、recover的使用
              • Go语言panic和recover的用法实例
              • Go语言异常处理(Panic和recovering)用法详解
              • Go语言使用defer+recover解决panic导致程序崩溃的问题

              站内搜索