【Go简明手册】panic和defer

panicrecover

panic() 函数用于抛出异常,recover() 函数用于捕获异常,这两个函数的原型如下:

1
2
func panic(interface{})
func recover() interface{}

当在一个函数中调用 panic() 时,正常的函数执行流程将立即终止,但函数中之前使用 defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行 panic() 流程,直至所属的 goroutine 中所有正在执行的函数被终止。错误信息将被报告,包括在调用 panic() 函数时传入的参数,这个过程称为错误流程处理。

panic() 接受一个 interface{} 参数,可支持任意类型,例如:

1
2
3
panic(404)
panic("network broken")
panic(Error("file not exists"))

defer 语句中,可以使用 recover() 终止错误处理流程,这样可以避免异常向上传递,但要注意 recover() 之后,程序不会再回到 panic() 那里,函数仍在 defer 之后返回。新建一个源文件 error1.go,输入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func foo() {
panic(errors.New("i'm a bug"))
return
}

func test() (result int) {
defer func() {
if r := recover(); r != nil {
err := r.(error)
fmt.Println("Cache Exception:", err)
}
}()
foo()
return 10
}

func main() {
fmt.Println(test()) // 0
}

【Go简明手册】panic和defer
https://hodlyounger.github.io/B_Code/GO/Go简明手册/Go语言顺序编程/panic和defer/【Go简明手册】panic和defer/
作者
mingming
发布于
2023年10月27日
许可协议