defer+recover错误回收

示例:

程序中出现错误/恐慌后程序被中断无法执行

package main

import "fmt"

func main() {
	kkk()
	fmt.Println("上面函数已经成功执行")
}

func kkk() {
    num1 := 2
	num2 := 0
	num3 := num1 / num2
	fmt.Println(num3)
}

使用defer+recover错误回收处理:

func recover

func recover() interface{}

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

package main

import "fmt"

func main() {
	kkk()
	fmt.Println("上面函数已经成功执行")
}

func kkk() {
	defer func() { //defer+recover来捕获错误
		if err := recover(); err != nil {
			//调用recover来捕获错误
			fmt.Println("err是", err)
			fmt.Println("错误已被捕获")
		}
	}()
	num1 := 2
	num2 := 0
	num3 := num1 / num2
	fmt.Println(num3)
}

自定义错误

自定义错误使用到函数

func New

func New(text string) error

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

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := kkk()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("上面函数已经成功执行")
}

func kkk() (err error) {
	num1 := 2
	num2 := 0
	if num2 == 0 {
		return errors.New("除数不能为零")
	} else {
		num3 := num1 / num2
		fmt.Println(num3)
		return nil
	}
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐