32

Go语言学习之 panic 和 recover

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzA4Mjc1NTMyOQ%3D%3D&%3Bmid=2247483785&%3Bidx=1&%3Bsn=afea4fec5cfe0588bcecf03c547c6cb2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

jIn63qf.jpg!web

01

概念

在 Go 语言中,虽然类型系统会捕获许多编译时错误。但是有些错误需要在运行时进行检查,例如数组越界访问。当 Go 语言在运行时检查到这些错误,它就会宕机。

也并不是所有的宕机都发生在运行时检查中,我们还可以直接调用内置函数 panic,panic 会立即中断当前函数流程,执行延迟调用 defer,因为 panic 内置函数的参数是空接口类型,因此可使用任何对象作为错误状态。

程序发生宕机时,中断程序是正确的处理方式。但是在一些情况下也可以进行恢复,在 Go 语言中,如果函数包含 defer 延迟调用,内置函数 recover 会在延迟函数 defer 的内部调用,它可以终止当前的宕机状态并返回宕机的值。函数将会在宕机的地方终止运行并正常返回,如果连续调用 panic,只有最后一个 panic 可以被 recover 捕获。

02

使用 panic 和 recover

在 defer 延迟调用函数中,recover 可捕获并返回 panic 提交的错误对象。

func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println("err = ", err)
}
}()
panic("exit...")
fmt.Println("game over!")
}

输出结果:

err =  exit...

连续调用 panic,只有最后一个 panic 可以被 recover 捕获。

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


defer func() {
panic("exit2...")
}()


panic("exit...")
}

输出结果:

err =  exit2...

提示:内置函数 panic 通常用于导致系统无法正常继续工作的错误,比如端口被占用、数据库未启动等错误。

B3yUfqm.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK