golang 学习(二十)defer 、panic、recover 用法,以及异常处理

defer 、panic、recover 用法,以及异常处理

defer 延迟执行语句

import (
	"errors"
	"fmt"
	"testing"

func TestDefer(t *testing.T) {
	//defer 延迟执行语句
	fmt.Println("start")
	defer fmt.Println("go")
	defer fmt.Println("go")
	defer fmt.Println("Let's")
	defer fmt.Println("end")
	//start
	//end
	//Let's
	//go
	//go
}

defer在命名返回值和匿名返回方法中表现不一样

func fn1() (x int) {
	x = 5
	defer func() {
		x++
	}()
	return x //6
}
func fn2() int {
	var a int = 5
	defer func() {
		a++
	}()
	return a //5
}
func fn3() (y int) {
	x := 5
	defer func() {
		x++
	}()
	return x //5
}
func fn4() (x int) {
	defer func(x int) {
		x++
	}(x)
	return 5 //5
}

在这里插入图片描述

defer 注册要延迟执行方法时,该方法所有的参数都需要确定其值

func calc(str string, a, b int) int {
	sum := a + b
	fmt.Println(str, a, b, sum)
	return sum
}
func TestCalc(t *testing.T) {
	x := 1
	y := 2
	defer calc("AA", x, calc("A", x, y))
	x = 10
	defer calc("BB", x, calc("B", x, y))
}

1.注册顺序
defer calc(“AA”, x, calc(“A”, x, y))
defer calc(“BB”, x, calc(“B”, x, y))
2.执行顺序
defer calc(“BB”, x, calc(“B”, x, y))
defer calc(“AA”, x, calc(“A”, x, y))
3.执行结果
A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4

panic/recover 以及异常处理

panic/recover 模式来处理错误
panic 可以在作任何地方引发,但recover 只有在defer 调用的方法中有效

func test1() {
	fmt.Println("异常开始")
}
func test2() {
	defer func() {
		err := recover() //收集异常
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	panic("这里有错误") //抛了异常
}
func TestException(t *testing.T) {
	test1()
	test2()
	fmt.Println("异常测试结束")
}

执行结果
在这里插入图片描述

模拟读取文件失败,异常处理

func TestException(t *testing.T) {
	doErr() //文件不存在
	fmt.Println("haha") //haha
}
func readfile(f string) error {
	if f == "main.go" {
		return nil
	} else {
		return errors.New("文件不存在") //注意引入error包
	}
}
func doErr()  {
	defer func() {
		e := recover()
		fmt.Println(e) //文件不存在
	}()
	err := readfile("demo.gp")
	if err !=nil{
		panic(err)
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值