不管使用什么语言写的程序都会有异常,这其中包括系统异常以及业务异常。
当业务逻辑校验错误的时候需要抛出一个业务异常。返回前台一个比较有好的信息
如果存在一些不确定的异常我们应该捕获,并且执行对应的逻辑。其他语言中有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就写完了。
欢迎关注,学习不迷路!