【Golang】panic和recover作用|Go主题月

简介: panic:一旦出现,就意味着程序的结束并退出。Go 语言中 panic 关键字主要用于主动抛出异常,类似 java 等语言中的 throw 关键字。recover:将程序状态从严重的错误中恢复到正常状态。Go 语言中 recover 关键字主要用于捕获异常,让程序回到正常状态,类似 java 等语言中的 try ... catch 。

网络异常,图片无法展示
|

关键字介绍

  • panic:一旦出现,就意味着程序的结束并退出。Go 语言中 panic 关键字主要用于主动抛出异常,类似 java 等语言中的 throw 关键字。
  • recover:将程序状态从严重的错误中恢复到正常状态。Go 语言中 recover 关键字主要用于捕获异常,让程序回到正常状态,类似 java 等语言中的 try ... catch

使用

  • panic
  1. 发生panic后,后续代码不会执行
  2. 发生panic后,会执行defer链表
  • 我们先创建两个协程,然后在其中一个协程里发生panic。看看另一个协程会怎么样。
package main
import "fmt"
func main() {
    // 第一个协程
  go func() {
    var i int
    for {
      i++
      fmt.Println("协程1")
      time.Sleep(1*time.Second)
             // 3秒后发生panic
      if i==3 {
        panic("异常退出")
      }
    }
  }()
  // 第二个协程
  go func() {
    for  {
      fmt.Println("协程2")
      time.Sleep(1*time.Second)
    }
  }()
    // 让主协程不退出
  for  {
    time.Sleep(1*time.Second)
  }
}
  • 当程序执行5秒后,其中一个协程就会发生panic("异常退出"),这时程序就会退出,随之另一个协程也结束了。
    输出:
协程2
协程1
协程2
协程1
协程2
协程1
协程2
panic: 异常退出
goroutine 6 [running]:
main.main.func1()
        /home/zheng/STUDY/GoWork/demo/main.go:28 +0xb9
created by main.main
        /home/zheng/STUDY/GoWork/demo/main.go:15 +0x35
  • 所以panic如果不捕获,就会导致程序整体关闭的严重的后果
  • recovery
  1. 为了解决panic的问题,go也提供了recovery这个函数,用于捕获异常,保证程序能正常运行。
  2. 只对当前goroutine发生的panic有效
  3. recovery要配合defer使用,因为recovery要在发生panic后执行才有效,但是发生panic的后续代码不会执行了,但是会执行defer
  • 我们对上面程序的第一个协程加上recovery
// 第一个协程
go func() {
    // 捕获异常
    defer func() {
        err:=recover()
        fmt.Printf("捕获的:%s\n",err)
    }()
    var i int
    for {
        i++
        fmt.Println("协程1")
        time.Sleep(1*time.Second)
        // 3秒后发生panic
        if i==3 {
            panic("异常退出")
        }
    }
}()
  • 输出:
协程2
协程1
协程1
协程2
协程2
协程1
协程2
捕获的:异常退出
协程2
协程2
...
  • 可以看到线程1的recovery捕获当前协程的panic的异常,并输出异常原因。但是另一个协程2还会继续执行。
目录
相关文章
|
1月前
|
JSON Kubernetes Go
利用 Golang 中的 Recover 处理错误
利用 Golang 中的 Recover 处理错误
|
17天前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
25 6
|
16天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
19 3
|
1月前
|
数据库连接 Go API
Golang中的25个常见错误:更好地进行go编程的综合指南
Golang中的25个常见错误:更好地进行go编程的综合指南
|
20天前
|
Go 开发者
|
20天前
|
Go 开发者
|
22天前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
24 0
|
2月前
|
运维 监控 测试技术
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
|
1月前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
1月前
|
Serverless Go
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决