Go语言painc( 宕机)和recover(恢复)

基本概念

签名函数
painc(i interface{}) // 宕机
revover()interface{} // 恢复

painc有两种情况产生一种是程序主动调用painc函数,另一种是程序产生运行时错误产生。
发生painc后程序会从调用painc的函数位置或发生painc的地方立即返回逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数而退出。
painc不但可以再函数正常流程中抛出,在defer逻辑里也可以再次调用painc或抛出painc,defer里面的painc能够被后续执行的defer捕获。
recover()是用来捕获painc的,组织painc继续向上传递,revocer和defer一起使用,但是recover()只有在defer后面的函数体内被直接调用才能捕获painc终止异常,否则返回nil,异常继续向外传递。

painc宕机代码,发生宕机后后续代码全部都不执行了,一层一层向上抛异常

func Test1() {
	fmt.Println("执行test1")
}

func TestPanic() {
	panic("宕机了")
}

func Test2() {
	fmt.Println("执行test2")
}

func main() {
	Test1()
	TestPanic()
	Test2()
}

输出

执行test1
panic: 宕机了

goroutine 1 [running]:
main.TestPanic(...)
        E:/workspace/go/study/main.go:10      
main.main()
        E:/workspace/go/study/main.go:19 +0x65

defer 代码 延迟自动执行代码,使用了defer关键字的会在所有正常代码执行完成后先入后出执行。

func Test(int uint8) {
	fmt.Println(int)
}

func TestPanic() {
	panic("宕机了")
}

func main() {
	defer Test(1)
	defer Test(2)
	fmt.Println("输出")
	Test(3)
	//TestPanic()
	Test(4)
	defer Test(5)
}

输出

输出
3
4
5
2
1

recover恢复
recover 必须搭配defer 语句使用,并且recover()函数必须在延迟函数内被调用执行才能正常工作。
defer一定要在可能引发panic的语句之前定义。


func Test(int uint8) {
	fmt.Println(int)
}

func TestPanic() {
	panic("宕机了")
}

func TestRecover() {
	defer func() {
		//捕获panic,并恢复程序使其继续运行
		if err := recover(); err != nil {
			fmt.Println("recover")
		}
	}()
	TestPanic() //主动抛出异常
}

func main() {
	Test(1) // 这里正常执行
	TestRecover() // 这里宕机并且恢复让程序正常执行
	Test(2) // 程序恢复正常执行
}

输出

1
recover
2

使用场景

  • 程序遇到了无法正常执行下去的错误,主动调用panic函数结束程序运行
  • 在调试程序中主动调用panic实现快速退出,然后打印堆栈信息快速的定位错误位置
    Go语言中有两种处理错误的方式,一种是使用panic和recover的抛出捕获机制,另一种时使用error错误类型(后边会介绍)

你可能感兴趣的:(golang,开发语言,后端)