Go语言引入了两个内置函数
panic()
和
recover()以报告和处理运行时错误和程序中的错误场景:
func panic(interface{})
func recover() interface{}
当在一个函数执行过程中调用panic()
函数时,正常的函数执行流程将立即终止,但函数中
之前使用
defer
关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致
逐层向上执行
panic
流程,直至所属的
goroutine中所有正在执行的函数被终止。
例如:
panic(404)
panic("network broken")
panic(Error("file not exists"))
recover()函数用于终止错误处理流程。一般情况下,
recover()
应该在一个使用
defer关键字的函数中执行以有效截取错误处理流程。如果没有在发生异常的goroutine
中明确调用恢复过程(使用recover
关键字),会导致该
goroutine
所属的进程打印异常信息后直接退出。
func foo() error {
defer func() {
if r := recover(); r != nil {
log.Printf("Runtime error caught: %v", r)
}
}()
// ...
}
无论foo()中是否触发了错误处理流程,该匿名
defer
函数都将在函数退出时得到执行。如果foo()
中触发了错误处理流程,
recover()
函数执行将使得该错误处理过程终止。如果错误处理流程被触发时,程序传给panic
函数的参数不为
nil
,则该函数还会打印详细的错误信息。