GO error异常接口
error接口
package main import ( "fmt" "errors" ) func dive(a int, b int) (value int, err error) { if b == 0 { err = errors.New("除数不能为0") return } value = a / b return } func main() { a := 10 b := 5 value, err := dive(a, b) if err != nil { fmt.Println("runtime error:",err) } else { fmt.Println(value) } }
panic异常
package main import "fmt" func test(i int){ var arr [10]int //panic("runtime error: index out of range") arr[i]=123 fmt.Println(arr) } func main() { test(10) //fmt.Println("hello world1") //fmt.Println("hello world2") ////当程序遇见panic是自动终止 //panic("hello world3") //fmt.Println("hello world3") //fmt.Println("hello world4") //fmt.Println("hello world5") }
延迟调用defer (根据入栈出栈规则执行)
package main import "fmt" func main0301() { fmt.Println("GO学习") defer fmt.Println("IT行业") defer fmt.Println("日薪越亿") fmt.Println("轻松就业") } func main0302() { a := 10 b := 20 //func (a int,b int){ // fmt.Println(a+b) //}(a,b) f := func(a int, b int) { fmt.Println(a + b) } //如果在defer 调用时将函数参数先放在内存中 是一个独立的空间 不会因为改变值允许数据 defer f(a, b) a = 123 b = 321 } func main() { a := 10 b := 20 f := func() { fmt.Println(a + b) } //如果不传递参数 使用外部的变量 如果外部变量修改 会影响函数的值 defer f() a = 123 b = 321 }
recover拦截
package main import "fmt" func demo(i int) { //错误拦截到出现在错误之前 defer func() { //错误拦截 panic异常错误 err := recover() //判断是否出现错误 if err != nil { fmt.Println(err) } }() var arr [10]int var p *int //0x0 nil //p = new(int) *p = 123 //数组下标越界 arr[i] = 123 fmt.Println(arr) } func main() { demo(10) fmt.Println("hello world") }