panic,recover 爆出异常,和捕获

package main

import (
	"fmt"
	"time"
)

func main() {
	f()
	fmt.Println("main end")
}

/*
1.多个defer 执行,最先定义的在栈底,最后定义的在栈顶,所有最后定义的最先执行
2.定义的defer里面的panic ,可以被它之前定义的recover捕获
3.recover 定义在defer func(){}() 函数中会被执行
*/
func f() {
	defer func() {
		fmt.Println("defer2 start")
		if err := recover(); err != nil {
			fmt.Println(err)
		}
		fmt.Println("defer2 end")
	}()
	defer func() {
		fmt.Println("defer1 start")
		if err := recover(); err != nil {
			panic(err)
		}
		fmt.Println("defer1 end")
	}()

	for {
		fmt.Println("func begin")
		a := []string{"c", "c"}
		fmt.Println(a[3])
		fmt.Println("func end")
		time.Sleep(1 * time.Second)
	}
}

  

posted on 2022-09-21 15:20  running-fly  阅读(37)  评论(0编辑  收藏  举报

导航