Golang基础——异常处理

异常处理

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")
}

上一篇:(2015年郑州轻工业学院ACM校赛题) J 堆


下一篇:循环结构基本了解