Golang 中 defer panic recover 简单使用

Golang defer、panic、recover

defer

defer 语句用于延迟执行一个函数调用,直到包含该 defer 语句的函数执行完毕。defer 语句通常用于释放资源、关闭文件、解锁互斥锁等操作。

defer 语句的执行顺序是后进先出,即最后被 defer 的语句最先执行。例如:

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")
    fmt.Println("main")
}

输出结果为:

main
defer 3
defer 2
defer 1

panic

panic 是 Go 语言中的一个内置函数,用于触发一个运行时错误。当程序执行到 panic 函数时,会立即停止当前函数的执行,并开始执行该函数中所有 defer 语句。然后,程序会沿着调用栈向上传播 panic,直到找到一个 recover 函数来捕获 panic,或者程序终止。

panic 函数通常用于处理不可恢复的错误,例如数组越界、空指针引用等。

recover 是 Go 语言中的一个内置函数,用于捕获 panic。当程序执行到 recover 函数时,会停止 panic 的传播,并返回 panic 的值。如果程序没有 panic,则 recover 函数返回 nil。

recover 函数通常用于处理 panic,例如在 defer 语句中捕获 panic,并执行一些清理操作。例如:

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("panic:", err)
        } else {
            fmt.Println("no panic")
        }
    }()
    panic("something wrong")
}

输出结果为:

panic: something wrong

注:panic 后面的语句都不会在执行包括调用的函数

func main() {
    defer func() {
		if err := recover(); err != nil {
			fmt.Println("main recover", err)
		}
	}()
	c := testPanic(3, 3)
	fmt.Println("继续执行", c)
        
}

func testPanic(a int, b int) (t int) {

	if a%b == 0 {
		panic("error ---------")
	} else {
		return a % b
	}

}

输出结果为:

main recover error ---------
posted @ 2024-08-08 16:59  影的记忆  阅读(4)  评论(0编辑  收藏  举报