go异常/错误机制(panic和error)

2023年1月3日12:55:49

defer

defer是go提供的一种延迟执行机制。

后进先出原则

当执行defer时,会将对应的函数压入栈中,在函数返回或者panic异常结束时,go会从栈中取出延迟函数执行。

func main(){
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
	fmt.Println("hello")
}

打印结果为

hello
3
2
1

立即解析原则

	i := 1
	defer fmt.Printf("first is %d\n", i) //1
	i = 2
	fmt.Printf("current is %d\n", i)//2

当 defer 以闭包的方式引用外部变量时,则会在延迟函数真正执行的时候,根据整个上下文确定当前的值

可修改返回值

func main()  {
 fmt.Println(test())
}
func test() (i int) {
 defer func() { i++ }()
 return 1
}

打印结果是2

panic

panic是一个严重错误机制,它会导致程序终止,并依次逆序执行 panic 所在函数可能存在的 defer 函数列表,然后返回该函数的调用方。
recover 内置函数可用于捕获 panic,重新恢复程序正常执行流程,但是 recover 函数只有在 defer 内部使用才有效

func main() {
	err := panicAndReturnErr()
	if err != nil{
		fmt.Printf("err is %+v\n", err)
	}
	fmt.Println("returned normally from panicAndReturnErr")
}
func panicAndReturnErr() (err error){
	defer func() {//如果defer内有recover,则从 panic 中恢复,不会终止程序
		if e := recover(); e != nil {//error occur!
			// 打印栈信息
			buf := make([]byte, 1024)
			buf = buf[:runtime.Stack(buf, false)]
			err = fmt.Errorf("[PANIC]%v\n%s\n", e, buf)
		}
	}()
	fmt.Println("panic begin")
	panic("error occur!")//开始执行defer函数
	fmt.Println("panic over")
	return nil
}

  • 作者:张先生的记录本
  • 原文链接:https://blog.csdn.net/weixin_41399470/article/details/112132402
    更新时间:2023年1月3日12:55:49 ,共 1021 字。