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

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

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


目录
相关文章
|
3月前
|
Web App开发 自然语言处理
一盏茶的功夫带你掌握烦人的 this 指向问题( 一 )
一盏茶的功夫带你掌握烦人的 this 指向问题( 一 )
|
3月前
|
Web App开发 自然语言处理
一盏茶的功夫带你掌握烦人的 this 指向问题( 二 )
一盏茶的功夫带你掌握烦人的 this 指向问题( 二 )
|
开发工具 Python
嗖嗖的,再也不怕被嘲笑了!!!
嗖嗖的,再也不怕被嘲笑了!!!
|
IDE 开发工具 Python
这样的奇技淫巧,劝你不用也罢
这样的奇技淫巧,劝你不用也罢
139 0
|
Python
一日一技:你的代码是如何被炫技毁掉的
一日一技:你的代码是如何被炫技毁掉的
104 0
程序人生 - 为什么大人永远不懂孩子的世界?
程序人生 - 为什么大人永远不懂孩子的世界?
112 0
程序人生 - 为什么大人永远不懂孩子的世界?
|
Java
老爷子这代码,看跪了! (上)
老爷子这代码,看跪了! (上)
147 0
老爷子这代码,看跪了! (上)
|
Java 程序员
老爷子这代码,看跪了! (中)
老爷子这代码,看跪了! (中)
141 0
老爷子这代码,看跪了! (中)
|
安全 Java
老爷子这代码,看跪了! (下)
老爷子这代码,看跪了! (下)
130 0
老爷子这代码,看跪了! (下)
|
Linux Windows
唉,被坑惨了!
32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。
唉,被坑惨了!