golang中recover和panic用法

房东的猫 提交于 2019-11-26 03:42:54

golang中没有try... catch...,所以当golang中遇到panic时,如果不进行recover,便会导致整个程序挂掉,具体例子如下:

package main

import (
	"fmt"
)

func main() {
	panic("fault")
	fmt.Println("panic")
}
运行结果:
panic: fault
  
  goroutine 16 [running]:...

程序挂掉,并且报告出错的地方,并打印出掉用的栈


解决办理:利用defer延迟处理的recover进行恢复,具体例子如下:

package main

import (
    "fmt"
)

func main() {
    defer func() {
        fmt.Println("1")
    }()
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    panic("fault")
    fmt.Println("2")
}

运行结果:
  fault
  1

程序首先运行panic,出现故障,此时跳转到包含recover()的defer函数执行,recover捕获panic,此时panic就不继续传递.但是recover之后,程序并不会返回到panic那个点继续执行以后的动作,而是在recover这个点继续执行以后的动作,即执行上面的defer函数,输出1.

注意:利用recover处理panic指令,必须利用defer在panic之前声明,否则当panic时,recover无法捕获到panic,无法防止panic扩散.


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!