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

2023年1月30日10:56:18

一、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= <nil>
	} 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...
}

  • 作者:浅弋、璃鱼
  • 原文链接:https://blog.csdn.net/qq_35709559/article/details/108682100
    更新时间:2023年1月30日10:56:18 ,共 1861 字。