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

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
}
原文地址:https://www.cnblogs.com/pythonwl/p/14664473.html