panic,recover

在 Go 语言中,panic 和 recover 是用于处理程序错误和恢复的两个关键机制。

panic:

panic 是一个内建函数,用于表示程序发生了无法处理的错误。当发生 panic 时,程序会立即停止执行当前函数的剩余代码,并开始在调用栈中向上逐层执行 deferred 函数,直到达到当前协程的最顶层(即程序的入口函数),然后程序将终止并输出 panic 信息。
panic 通常用于表示不可恢复的错误,比如空指针引用、数组越界等,或者是程序运行过程中的一些不合法操作。
recover:

recover 也是一个内建函数,用于在 defer 延迟执行的函数中捕获 panic 引起的错误,使程序能够继续执行而不会被终止。
recover 只能在 defer 中调用,并且只在发生 panic 时才会生效。如果在没有 panic 的情况下调用 recover,它将返回 nil。
当 recover 在 defer 中调用时,如果有 panic 发生,它将会返回被传递给 panic 的值,并且程序将继续执行而不会终止。

package main

import (
	"fmt"
)

func recoverFromPanic() {
	if r := recover(); r != nil {
		fmt.Println("Recovered from panic:", r)
	}
}

func divide(a, b int) int {
	// defer语句用于注册在当前函数返回时调用的函数
	defer recoverFromPanic()

	if b == 0 {
		panic("Cannot divide by zero!")
	}

	return a / b
}

func processDivision(x, y int) {
	result := divide(x, y)
	fmt.Println("Result of division:", result)
}

func main() {
	// Case 1: Valid division
	processDivision(10, 2)

	// Case 2: Division by zero
	processDivision(10, 0)

	fmt.Println("Program continues after division.")
}