Golang recover的使用

1、recover 概述

在 Go 语言中,recover() 函数用于从 panic 中恢复程序的控制流。recover() 通常用于防止程序在遇到 panic 时立即终止,而是允许程序执行一些清理操作或继续执行。具体来说,recover() 有以下作用:

捕获 panic: 当 recover() 函数在 defer 中被调用时,它会捕获当前的 panic,并返回 panic 的值。如果没有 panic,recover() 返回 nil。

避免程序崩溃: 通过结合 recover() 和 defer,你可以防止 panic 导致程序崩溃。这样,即使在函数执行期间发生了 panic,程序仍然可以继续执行后续的代码而不会立即终止。

进行清理工作: 你可以使用 recover() 来执行一些清理工作,例如关闭文件、释放资源等。这是因为即使发生 panic,recover() 也可以让你有机会在函数返回之前执行必要的清理操作。

以下是一个简单示例,演示了如何使用 recover() 来处理 panic:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("发生了 panic:", r)
            // 在这里可以执行一些清理操作
        }
    }()

    // 模拟一个引发 panic 的情况
    panic("这是一个 panic")
    
    // 这里的代码将不会被执行,因为上面的 panic 已经终止了程序的正常流程
    fmt.Println("这段代码不会被执行")
}

在这个示例中,deferrecover() 用于捕获并处理 panic,使程序能够继续执行。注意,recover() 必须在 defer 函数内部调用才能生效。 

2、示例

package main
 
import "fmt"
 
func testa() {
    fmt.Println("111111111111111")
}
 
func testb(x int) {
    //设置recover,recover只能放在defer后面使用
    defer func() {
        //recover() //可以打印panic的错误信息
        //fmt.Println(recover())
        if err := recover(); err != nil { //产生了panic异常
            fmt.Println(err)
        }
 
    }() //别忘了(), 调用此匿名函数
 
    var a [10]int
    a[x] = 111 //当x为20时候,导致数组越界,产生一个panic,导致程序崩溃
}
 
func testc() {
    fmt.Println("333333333333333")
}
 
func main() {
    testa()
    testb(20) //当值是1的时候,就不会越界,值是20的时候,就会越界报错。
    testc()
}

执行结果:

111111111111111
runtime error: index out of range //值越界
333333333333333
posted @ 2021-08-30 14:39  人艰不拆_zmc  阅读(682)  评论(0编辑  收藏  举报