Golang语言错误处理机制

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.利用defer+recover捕获错误

package main

import "fmt"

func cal(a, b int) (res int) {

	// 利用defer+recover来捕获错误提高程序的健壮性,避免程序直接崩溃
	//
	// 温馨提示:
	//		(1)recover()必须搭配defer使用;
	//		(2)defer一定要在可能引发panic的语句之前定义;
	defer func() {

		// 调用recover内置函数,可以捕获错误
		err := recover()

		// 如果没有捕获错误,返回值为零值(nil)
		if err != nil {
			fmt.Printf("错误捕获err: [%v]\n", err)
		}
	}()

	// 注意,除数不能为0,否则会抛出异常哟~
	res = a / b

	// 如果上一行代码执行出错,就不会执行下面的一行代码啦~
	fmt.Println("cal 函数运行结束")

	return
}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result := cal(x, y)

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函数运行结束")
}

二.基于errors.New自定义错误

package main

import (
	"errors"
	"fmt"
)

func cal(a, b int) (res int, err error) {

	defer func() {

		err := recover()

		if err != nil {
			fmt.Printf("错误捕获err: [%v]\n", err)
		}

	}()

	if b == 0 {
		// 抛出自定义错误,需要调用errors包下的New函数
		return res, errors.New("除数不能为0哟~")
	} else {
		// 如果除数不为0,那么就可以正常执行了
		res = a / b
		fmt.Println("cal 函数正常运行结束")

		// 如果没有错误,返回零值即可
		return res, nil
	}

}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result, err := cal(x, y)
	if err != nil {
		fmt.Printf("cal 函数异常运行结束,err ---> [%v]\n", err)
	}

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函数运行结束")
}

三.panic自定义错误

package main

import (
	"errors"
	"fmt"
)

func cal(a, b int) (res int, err error) {

	defer func() {

		err := recover()
		if err != nil {
			fmt.Printf("错误捕获err: [%v]\n", err)
		}

	}()

	if b == 0 {
		return res, errors.New("除数不能为0哟~")
	} else {
		res = a / b
		fmt.Println("cal 函数正常运行结束")
		return res, nil
	}

}

func main() {
	var (
		x = 10
		// y = 5
		y = 0
	)

	result, err := cal(x, y)
	if err != nil {
		// 如果程序出现错误以后,后续代码没有必要执行,想要程序中断退出程序,可以借助内建函数(builtin)包下内置函数: "panic"。
		panic(err)
	}

	fmt.Printf("%d ➗ %d = %d\n", x, y, result)

	fmt.Println("main 函数运行结束")
}



posted @ 2024-07-21 00:38  尹正杰  阅读(21)  评论(0编辑  收藏  举报