41

简明笔记:defer、panic、recover 详解。

 4 years ago
source link: https://studygolang.com/articles/20208?amp%3Butm_medium=referral
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.

Go 简明笔记:defer 、恐慌panic、恢复recover 。

Form 面向奶酪的简明笔记

defer

defer语句用来调用一个函数调用(被延期的函数),在执行defer的函数返回之前才会被执行。

常用来释放资源,会在函数返回之前进行调用。

举个栗子:

func main() {
   fmt.Println("1  Iron Man")
   fmt.Println("2  Iron Man")
   defer fmt.Println("main defer")  
   foo1()
   }
func foo1(){
   defer fmt.Println("foo1 defer")  
   fmt.Println("1 Spider Man")
   fmt.Println("2 Spider Man")
}
输出结果:
1 Iron Man
2 Iron Man
1 Spider Man
2 Spider Man
foo1 defer
main defer

defer会在函数返回之前执行。

panic & recover ,恐慌与恢复。

panic():是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。

当在一个函数执行过程中调用 panic() 函数时,正常的函数执行流程将立即终止,但函数中 之前使用 defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致 逐层向上执行 panic 流程,直至所属的goroutine中所有正在执行的函数被终止。这一过程继续向上,直到程 序崩溃时的所有 goroutine 返回。 恐慌可以直接调用 panic 产生。也可以由运行时错误产生,例如访问越界的数组。

recover():是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。 Recover 仅在延迟函数中有效。 在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。如果当前 的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执 行。

recover 务必配合defer函数一起使用。

package main

import "fmt"

func main() {
	fmt.Println("程序开始执行")
	defer func() {
		if msg:=recover();msg!=nil {
			fmt.Println("打印异常--->",msg)
		}
	}()
	pic()
}
func pic(){
	fmt.Println("1")
	panic("panic...")
	fmt.Println("2")
}

输出结果:
程序开始执行
1
打印异常---> panic...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK