recover 没有捕获异常_defer 、panic 和 recover的小特性

1127f3ca192e6dd1737d286d0b6881e4.png
package main

import "fmt"

func main() {



	/*
	输出结果
	1
	5
	1
	*/

	fmt.Println(f())
	fmt.Println(f1())
	fmt.Println(f2())


	/*
	输出结果
	c: 1
	b: 0
	a: 0
	*/
	g()
}


/*
return xxx 不是一个原子指令

含有defer的函数执行过程为
	1. 给返回值赋值
	2. 执行defer函数
	3. 返回到更上一级调用函数

*/


func f() (result int) {
	defer func() {
		result++
	}()
	return 0
}

func f1() (r int) {
	t := 5
	defer func() {
		t = t + 5
	}()
	return t
}

func f2() (r int) {
	defer func(r int) {
		r = r + 5
	}(r)
	return 1
}



/*
defer函数的参数值是在申请defer时确定下来的

当defer函数声明时,对外外部的变量的引用方式有2种
	1.作为函数的参数:在defer声明时就包值传递给defer,并将值缓存,调用defer的时候使用缓存的值进行计算
	2. 最为闭包引用时,在defer函数执行时根据整个上下文确定当前的值
 */



func g() {
	i := 0
	defer fmt.Println("a:", i)
	//闭包调用,将外部i传到闭包中进行计算,不会改变i的值,如上边的例3
	defer func(i int) {
		fmt.Println("b:", i)
	}(i)
	//闭包调用,捕获同作用域下的i进行计算
	defer func() {
		fmt.Println("c:", i)
	}()
	i++
}
/*
recover的返回值表示当前goroutine是否有panic行为



1、defer 表达式的函数如果定义在 panic 后面,该函数在 panic 后就无法被执行到
2、recover都是在当前的goroutine里进行捕获的,这就是说,对于创建goroutine的外层函数,
   如果goroutine内部发生panic并且内部没有用recover,外层函数是无法用recover来捕获的,这样会造成程序崩溃
 */

func main() {



	defer fmt.Println("111111")

	defer func() {
		if err := recover();err != nil{
			fmt.Println(err)
		}
	}()
	defer fmt.Println("22222")

	panic("ffff")
	defer fmt.Println("333")


}

参考资料

go defer,panic,recover详解 go 的异常处理​www.jianshu.com
4f3c19b52dcf9e62d209aec058102716.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值