Golang 运行时异常和 panic
在 Go 语言中,运行时异常通常是通过 panic
机制来处理的。当程序执行过程中遇到了一个不可恢复的错误时,可以通过调用 panic
函数来停止当前的 goroutine,并开始进行异常的传播和清理流程。
panic
函数的定义如下:
func panic(interface{})
当程序执行到 panic
时,当前的 goroutine 会立即停止执行后续的代码,开始逐层向上执行函数的堆栈,查找是否存在异常处理的代码,即 recover
函数。如果找到了 recover
,panic
的异常就会被捕获,程序可以根据 recover
的返回值来进行相应的处理,防止整个程序崩溃。
recover
函数的定义如下:
func recover() interface{}
recover
必须在 defer
关键字修饰的函数中直接使用,否则不会生效。defer
关键字会注册一个函数,在它所在的函数退出时执行。
下面是一个简单的使用 panic
和 recover
的例子:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in main", r)
}
}()
f()
fmt.Println("Returned normally from f.")
}
func f() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
g()
}
func g() {
panic("Panic in g.")
}
在这个例子中,panic
被调用于 g
函数内,recover
被调用于 f
和 main
函数中的 defer
函数内。由于 recover
能够捕获到 panic
抛出的异常,程序就不会因为 panic
而崩溃,而是按照正常的流程打印出相应的信息。
评论已关闭