Go 语言中的错误和异常处理
在 Go 语言中没有与 Java 或者 .NET 类似的异常处理机制。Go 语言的开发者认为类似的异常处理已经被过多的使用了,这样的异常机制过度依赖上层代码对异常的处理,如果上层代码对异常的处理不到位会使程序出一些不易排查的BUG。所以为了让开发者能够 重视并正确的处理每一个可能会出现异常的函数,Go语言采用返回值的形式来返回错误 。这一机制,既可以让开发者真正理解错误处理的含义,也可以大大降低程序的复杂度。
1.error 接口
error 是 系统自带 的一个接口类型的自定义类型。
代码如下:
type error interface {
Error() string
}
2. errors 包
Tips :包的概念会在后文的Go语言中的包管理中详细介绍
errors 包中包含了一个实现了 error 这个接口的结构体类型 errorString 。我们可以直接使用包中的方法来自定义一些错误,从而返回我们希望被上层代码处理的错误信息。
代码示例:
package main
import (
"errors"
"fmt"
)
func main() {
t, err := divide(2, 0)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(t)
}
}
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
- 第 19 行:使用 errors.New 自定义一个除数不能为0的错误;
- 第 10~12 行:若除数为零,则输出这个错误。
执行结果:
3. 异常处理
如果你调用的方法的开发者不够仔细,并没有将所有的异常都考虑到并作为错误返回,那你的程序可能就会 被其影响而崩溃 。对这种情况,GO 语言提供了一个叫recover()
的函数,用于处理这种问题。一般常用于服务启动的入口函数,因为网络等外部因素,极有可能会导致程序异常,这些异常就需要这个函数来捕获。
代码示例:
package main
import (
"fmt"
)
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println("程序运行中出现异常:", err)
}
}()
t := divide(2, 0)
fmt.Println(t)
}
func divide(a, b int) int {
return a / b
}
- 第 17 行:在没有判断除数的情况下直接做除法,若除数为零,程序直接崩溃。
- 第 8~11 行:在 main 函数结束时,获取执行过程中的错误,若没有错误者err为nil。
执行结果:
4. 小结
本位介绍了 Go 语言中如何使用 errors 包 来自定义错误,如何去使用函数中返回出来的 error 类型变量 ,来处理自定义错误以及在 无法避免的异常出现的时候 如何使用recover()
来保障程序不崩溃。
本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。