golang学习七:异常处理:error接口, panic函数, 延时调用defer, recover

文章目录

  • 一、error接口:
    • 1. 使用error接口
  • 二、panic函数:
    • 1. panic函数的使用:
  • 三、延时调用defer:
    • 1. defer的使用:
    • 2. 在异常中的使用:
    • 3. 与匿名函数配合:
  • 四、recover:
    • 1. recover的使用:

一、error接口:

1. 使用error接口

package main  import ( 	"fmt" )  func test(a, b int) (res int, err error) { 	err = nil 	if b == 0 { 		fmt.Println("err=", err) // err=  	} else { 		res = a / b 	} 	return }  func main() { 	res, err := test(10, 0) 	if err != nil { 		fmt.Println("err = ", err) 	} else { 		fmt.Println(res) // 0 	} } 

二、panic函数:

1. panic函数的使用:

panic函数: 当程序遇到panic函数会自动终止;

package main  import "fmt"  func main() { 	fmt.Println("hello...") 	fmt.Println("hello...") 	fmt.Println("hello...") 	panic("hello") 	fmt.Println("hello...") 	fmt.Println("hello...")  	// hello... 	// hello... 	// hello... 	// panic: hello  	// goroutine 1 [running]: 	// main.main() 	//         /Users/chengfei/Documents/学习/02_Golang学习/09_异常处理/02_panic函数.go:9 +0x145 	// exit status 2  } 

三、延时调用defer:

1. defer的使用:

  • defer执行顺序:
    • 一个函数有多个defer语句, 他们以"后进先出"的顺序执行
func main() { 	defer fmt.Println("你好...") 	defer fmt.Println("世界...") 	defer fmt.Println("hello...") 	fmt.Println("world...") 	// world... 	// hello... 	// 世界... 	// 你好... } 

2. 在异常中的使用:

即使函数或者某个延迟调用发生了错误, 这些调用依旧会被执行

func test(x int) int { 	v := 100 / x 	return v } func main() { 	defer fmt.Println("你好...") 	defer fmt.Println("世界...") 	defer test(0) 	defer fmt.Println("hello...") 	defer fmt.Println("world...") 	// world... 	// hello... 	// 世界... 	// 你好... 	// panic: runtime error: integer divide by zero } 

3. 与匿名函数配合:

func main() { 	a, b := 10, 20 	defer func() { 		fmt.Println("匿名函数: ", a, b) 	}() 	a = 100 	b = 200 	println("main函数", a, b) } main函数 100 200 匿名函数:  100 200 
func main() { 	a, b := 10, 20 	defer func(a, b int) { 		fmt.Println("匿名函数: ", a, b) 	}(a, b) 	a = 100 	b = 200 	println("main函数", a, b) } // main函数 100 200 // 匿名函数:  10 20 

四、recover:

1. recover的使用:

package main  import "fmt"  func testA() { 	fmt.Println("testA...") } func testB(x int) { 	// 设置recover() 	// 在defer调用的函数中使用recover() 	defer func() { 		// 防止程序崩溃 		// recover() 		if err := recover(); err != nil { 			fmt.Println(err) 		} 	}() // 匿名函数调用  	var a [3]int 	a[x] = 999 	fmt.Println(a) } func testC() { 	fmt.Println("testC...") } func main() { 	testA() 	testB(3) // err: 下标越界 	testC()  	// testA... 	// runtime error: index out of range [3] with length 3 	// testC... }