Go错误

1. error

package main

import (
	"errors"
	"fmt"
)

func main() {
	/*
	error:内置的数据类型,内置的接口
		定义方法:Error() string

	使用go语言提供好的包:
		errors包下的函数:New(),创建一个error对象
		fmt包下的Errorf()函数:
			func Errorf(format string, a ...interface{}) error
	 */
	//1.创建一个error数据
	err1 := errors.New("自己创建玩的。。")
	fmt.Println(err1) //自己创建玩的。。
	fmt.Printf("%T\n", err1) //*errors.errorString

	//2.另一个创建error的方法
	err2 := fmt.Errorf("错误的信息码:%d", 100)
	fmt.Println(err2) //错误的信息码:100
	fmt.Printf("%T\n", err2) //*errors.errorString

	err3 := checkAge(-30) //您给定的年龄是:-30,不合法
	if err3 != nil {
		fmt.Println(err3)
		return 
	}
	fmt.Println("程序。。。go on。。。")
}

//设计一个函数:验证年龄是否合法,如果为负数,就返回一个error
func checkAge(age int) error {
	if age < 0 {
		//返回error对象
		//return errors.New("年龄不合法")
		err := fmt.Errorf("您给定的年龄是:%d,不合法", age)
		return err
	}
	fmt.Println("年龄是:", age)
	return nil
}

2. panic/recover

package main

import "fmt"

func main() {
	/*
	panic:词义"恐慌",
	recover:"恢复"
	go语言利用panic(),recover(),实现程序中的极特殊的异常的处理
		panic(),让当前的程序进入恐慌,中断程序的执行
		recover(),让程序恢复,必须在defer函数中执行
	 */
	//恢复函数
	//需要在panic之前执行到recover
	defer func() {
		if msg := recover(); msg != nil {
			fmt.Println(msg, "程序回复啦。。。")
		}
	}()
	funA()
	//先被defer的后执行,后被defer的先执行
	defer myprint("defer main:3.....")
	funB() //panic传递到这,下面的下面不执行
	defer myprint("defer main:4.....") //不会执行到这话

	fmt.Println("main..over。。。。") //不会执行到这话

}
func myprint(s string) {
	fmt.Println(s)
}

func funA() {
	fmt.Println("我是一个函数funA()....")
}

func funB() { //外围函数

	fmt.Println("我是函数funB()...")
	defer myprint("defer funB():1.....")

	for i := 1; i <= 10; i++ {
		fmt.Println("i:", i)
		if i == 5 {
			//让程序中断
			panic("funB函数,恐慌了") //下面的代码不执行
		}
	} //当外围函数的代码中发生了运行恐慌,只有其中所有的已经defer的函数全部都执行完毕后,该运行恐慌才会真正被扩展至调用处。
	defer myprint("defer funB():2.....")
}

  

 

posted @ 2020-02-02 05:51  1769987233  阅读(90)  评论(0)    收藏  举报