异常处理
panic : 相当于 python 的 raise
func test111() interface{} {
return 1 / 1
}
func main() {
a := test111()
// panic("111") // 报错结束,致命错误,一般不用 相当于 raise
fmt.Println(a)
}
defer : 栈结构
func main() {
defer fmt.Println("good") // 最后执行,必须在函数内使用
defer fmt.Println("world") // 后进先出,栈结构
// world
// good
// defer中,延迟调用函数,报错,其他代码依然执行
x := 10
y := 20
defer func() {
fmt.Println(x, y)
}()
x = 100
y = 200
fmt.Println(x, y)
// 100 200
// 100 200
x := 10
y := 20
defer func(x int, y int) {
fmt.Println(x, y)
}(x, y)
x = 100
y = 200
fmt.Println(x, y)
// 100 200
// 10 20
// defer 虽然后执行,但是如果匿名函数有参数,会先传参数,再后执行。
}
recover : 相当于 try except
func tcore(x int) {
var a [1]int
fmt.Println(a[x])
}
func tcore1(x int) { // recover 必须搭配defer使用,并且匿名函数 相当于 try except
defer func() { // recover 必须在defer调用的函数中使用
if err := recover(); err != nil { // 如果recover返回为空,说明没报错,不打印
fmt.Println(recover())
}
}()
var a [1]int
fmt.Println(a[x])
}
// aaa
// runtime error: index out of range [3] with length 1
// bbb
func main() {
fmt.Println("aaa")
// tcore(3) // 运行报错结束
tcore1(0) // 不会报错,继续运行,recover (搭配defer使用)
fmt.Println("bbb")
}
recover() 补充
package main
import "fmt"
func getitem(i int) interface{}{
defer func(){
// fmt.Println(recover()) // Println 也是取出
if err:=recover();err!=nil{
//fmt.Println(recover()) // 结果为:nil,已经赋值给err,不能再取,管道
fmt.Println(err) // runtime error: index out of range
// fmt.Println("aaa")
}
}()
arr := []int{1,2,3}
fmt.Println(arr[i])
return arr[i]
}
func main() {
getitem(3) // runtime error: index out of range
getitem(2) // 3
}