当前位置: 首页 > 工具软件 > godot-go > 使用案例 >

go语言中异常的使用及捕获

那绪
2023-12-01

不管使用什么语言写的程序都会有异常,这其中包括系统异常以及业务异常。

当业务逻辑校验错误的时候需要抛出一个业务异常。返回前台一个比较有好的信息

如果存在一些不确定的异常我们应该捕获,并且执行对应的逻辑。其他语言中有try catch 那么go语言怎么来实现呢

下面我们先看一下go中的异常

抛出异常很简单,只需要 panic 一下,这个方法会终止程序

go中定义异常有两种方式,一种是errors.New()、另一种是定义一个结构体实现Error方法

下面我们来使用一下

func main() {
	panic(errors.New("服务器异常"))
	fmt.Println("执行业务")
}

报错

panic: 服务器异常

goroutine 1 [running]:
main.main()
	/Users/wendell/GolandProjects/blog/error.go:50 +0x2c

大部分情况下,我们不希望报错的时候将程序终止,可以使用 defer 与 recover 来捕获异常

defer 不管业务正常结束还是抛出错误,在方法执行结束时会执行 defer 后面定义的函数

recover 捕获异常

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("捕获异常", err)
		}
	}()
	panic(errors.New("服务器异常"))
	fmt.Println("执行业务")
}

执行结果

捕获异常 服务器异常

虽然捕获到了异常,程序没有因为异常而终止,但是却没有执行后面的业务,如果要保护后续代码执行,要怎么做呢

上面说到 defer 是在方法结束时执行,那么只需要上面报错与捕获逻辑不在一个方法内就可以了,于是使用匿名函数重构

func main() {
	func() {
		defer func() {
			if err := recover(); err != nil {
				fmt.Println("捕获异常", err)
			}
		}()
		
		panic(errors.New("服务器异常"))
	}()
	
	fmt.Println("执行业务")
}

执行

捕获异常 服务器异常
执行业务

虽然现在达到了效果,但是如果业务中有许多这样的地方,都要这么写也挺麻烦。那么有没有像其它语言中try catch来处理呢

可以将 try 中的逻辑当作一个函数,catch 中的逻辑当作一个函数,如果有报错执行 catch 函数,于是封装一个方法

func try(tryFunc func(), catchFunc func(interface{})) {
	defer func() {
		if err := recover(); err != nil {
			catchFunc(err)
		}
	}()

	tryFunc()
}

重构代码

func main() {
	try(func() {
		panic(errors.New("服务器异常"))
	}, func(err interface{}) {
		fmt.Println("捕获异常", err)
	})

	fmt.Println("执行业务")
}

执行

捕获异常 服务器异常
执行业务

到这一个简单的try catch就写完了。

欢迎关注,学习不迷路!

 类似资料: