当前位置:   article > 正文

GO 错误处理

go 错误处理


defer+recover机制处理错误

(1)我们来写一个错误

package main

import "fmt"

func main() {
	test()
	fmt.Println("上面的除法操作执行成功...")
	fmt.Println("正常执行下面的逻辑...")
}
func test() {
	num1 := 10
	num2 := 0
	result := num1 / num2   //第13行
	fmt.Println(result)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

我们来运行一下,结果如图:
在这里插入图片描述
意思是(死机:运行时错误:整数被零除)

发现:程序中出现错误/恐慌以后,程序被中断,无法继续执行。

(2)错误处理/捕获机制
GO中追求代码优雅,引入机制:defer+recover机制处理错误 。
内置函数recover:

func recover() interface{}

内建函数recover允许程序管理恐慌过程中的GO程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。

package main

import "fmt"

func main() {
	test()
	fmt.Println("上面的除法操作执行成功...")
	fmt.Println("正常执行下面的逻辑...")
}
func test() {
	//利用defer+recover来捕获错误:defer后加上匿名函数的调用
	defer func() {
		//调用recover内置函数,可以捕获错误:
		err := recover()
		//如果没有捕获错误,返回值为零值:nil
		if err != nil {
			fmt.Println("捕获到错误")
			fmt.Println("err是:", err)
		}
	}()

	num1 := 10
	num2 := 0
	result := num1 / num2
	fmt.Println(result)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在这里插入图片描述

优点:提高程序健壮性

自定义错误

自定义错误:需要调用errors包下的New函数:函数返回error类型

func New(text string) error

使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(…))。

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := test()
	if err != nil {
		fmt.Println("自定义错误:", err)
	}
	fmt.Println("上面的除法操作执行成功...")
	fmt.Println("正常执行下面的逻辑...")
}
func test() (err error) {
	num1 := 10
	num2 := 0
	if num2 == 0 {
		//抛出自定义错误:
		return errors.New("除数不能为0喔")
	} else { //如果除数不为0,那么正常执行就可以了
		result := num1 / num2
		fmt.Println(result)
		//如果没有错误,返回零值:
		return nil
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行结果:

在这里插入图片描述
有一种情况:程序出现错误以后,后续代码就没有必要执行,想让程序中断,退出程序:

借助:builtin包下内置函数:panic

func panic(v interface{})

内建函数panic停止当前Go程的正常执行。当函数F调用panic时,F的正常执行就会立刻停止。F中defer的所有函数先入后出执行后,F返回给其调用者G。G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。

package main
import (
	"errors"
	"fmt"
)

func main() {
	err := test()
	if err != nil {
		fmt.Println("自定义错误:", err)
panic(err)
	}
	fmt.Println("上面的除法操作执行成功...")
	fmt.Println("正常执行下面的逻辑...")
}
func test() (err error) {
	num1 := 10
	num2 := 0
	if num2 == 0 {
		//抛出自定义错误:
		return errors.New("除数不能为0喔")
	} else { //如果除数不为0,那么正常执行就可以了
		result := num1 / num2
		fmt.Println(result)
		//如果没有错误,返回零值:
		return nil
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42818
推荐阅读
相关标签
  

闽ICP备14008679号