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

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

/ 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 问题。


目录
打赏
0
0
0
0
6
分享
相关文章
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
189 0
用“三国杀”讲“分布式算法”,这下舒适了吧?
前言 《三国杀》是一款热门的卡牌游戏,结合中国三国时期背景,以身份为线索,以卡牌为形式,益智休闲,老少皆宜。 东汉末年,袁绍作为盟主,汇合了十八路诸侯一起攻打董卓。 在讲解之前,我们先聊下分布式协议和算法整体脉络。 现在很多开发同学对分布式的组件怎么使用都有一定经验,也知道 CAP 理论和 BASE 理论的大致含义。但认真去看分布式算法的真的很少,原因有三:
这样的奇技淫巧,劝你不用也罢
这样的奇技淫巧,劝你不用也罢
161 0
一日一技:你的代码是如何被炫技毁掉的
一日一技:你的代码是如何被炫技毁掉的
127 0
老爷子这代码,看跪了! (下)
老爷子这代码,看跪了! (下)
143 0
老爷子这代码,看跪了! (下)
老爷子这代码,看跪了! (中)
老爷子这代码,看跪了! (中)
153 0
老爷子这代码,看跪了! (中)
老爷子这代码,看跪了! (上)
老爷子这代码,看跪了! (上)
158 0
老爷子这代码,看跪了! (上)

相关实验场景

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等