GO编程(打卡)-Task10: 异常处理

defer函数

在golang中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量

规则

  • 当defer被声明时,其参数就会被实时解析

  • defer执行顺序为先进后出

  • defer可以读取有名返回值

package main

import "fmt"

// 规则一
func a(){
	i := 0
	defer fmt.Println("rule1",i) // 0
	i++
	defer fmt.Println("rule1",i) // 1
	return
}

// 规则二
func b(){
	for i := 0;i < 3;i++{
		defer fmt.Println("rule2",i)
	}
}

// 规则三
func c()(i int){
	defer func(){
		i++
	}()
	return 1
}
func main() {
	a()
	b()
	c()
}

异常处理

package main

import (
	"fmt"
	"errors"
)

type NotNature float64

func (err NotNature) Error() string{
	return fmt.Sprintf("自然数为大于或等于0的数: %v",float64(err))
}

func Nature(x float64)(float64, error){
	if x < 0 {
		return 0,NotNature(x)
	}else{
		return x,nil
	}
}

func f(){
	fmt.Println("1")
	panic("I am a panic.")
	fmt.Println("2")
}

func main() {
	// error
	// New函数返回格式为给定文本的错误
	// 即使文本是相同的,每次对New的调用都会返回一个不同的错误值
	err1 := errors.New("This is an error.")
	if err1 != nil{
		fmt.Println("(errors.New)",err1)
	}
	err2 := fmt.Errorf("This is an error.")
	if err2 != nil{
		fmt.Println("(fmt.Errorf)",err2)
	}
	// 自定义错误
	fmt.Println(Nature(1))
	fmt.Println(Nature(-1))
	// panic
	// panic捕捉到错误,为了程序能继续执行下去需要recover
	fmt.Println("=======panic=======")
	defer func(){
		fmt.Println("我是defer里面第一个打印函数")
		if err := recover();err!=nil{
			fmt.Println(err)
		}
		fmt.Println("我是defer里面第二个打印函数")
	}()
	f()
}

参考

https://github.com/datawhalechina/go-talent/blob/master/9.异常处理.md

https://studygolang.com/articles/10167

posted @ 2020-12-20 23:59  柔南青空  阅读(86)  评论(0编辑  收藏  举报