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 ", err1) //*errors.errorString //2.另一个创建error的方法 err2 := fmt.Errorf("错误的信息码:%d", 100) fmt.Println(err2) //错误的信息码:100 fmt.Printf("%T ", 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.....") }