前言
通常我们需要编写好的错误处理方式,在了避免某些程序员滥用异常,于是Go这里直接把异常这一块给砍掉了,最终还是通过返回值来判断程序的异常情况,毕竟Go可是支持多返回值的语言,比如atoi、itoa等函数,就不能忽略它的第二个返回值,因为第二个返回值代表了转换是否成功!不过Golang还是提供了一些错误处理机制的
Go的错误机制
1、没有异常机制
2、error类型实现了error接口
3、可以通过errors.New来快速创建错误实例
- type error interface{
- Error() string
- }
- error.New("n must be in range[0, 1]")
但是这样做只是给开发者标识,Code怎么认识呢?难道去string里判断吗?当然不是,可以预定义一些错误:
处理错误最佳实践
1、预定义错误,code里判断
2、及早失败,避免嵌套
panic与recover
panic用于不可恢复的错误,类似于Java的Error
panic退出前会执行defer指定的内容
panic和os.Exit
os.Exit退出时不会调用defer指定的函数
os.Exit退出时不会输出当前调用栈信息
接下来看看recover
在Java中如果你不知道要抛出什么错误,于是乎很多人直接来个Catch Throwable,作为一个异常无Fack说,C++中是直接catch…作为一个异常无Fack说
在Go语言中可以通过defer定义的函数去执行一些错误恢复的行为
很多人容易在defer处理错误时把recover获得的错误对象打印到日志文件中,这是一种非常危险的做法,一定要当心recover在做的事情,因为recover的时候并不去检测到底发生了什么错误,而是直接忽略了这个错误,那么如果这个时候系统的核心资源消耗完了,如果我们强制性的恢复的话系统仍然是不能正常工作的,还会导致我们的健康检查程序没办法检查出当前系统的问题,因为很多的health check只是检查进程在还是不在,因为我们的进程是在的,所以会导致僵尸服务进程,虽然活着但是无法正常提供服务。于是我们可以采用恢复设计模式中的一种叫做Let it Crash ,health check进程就会帮我们重启这个服务
总结
到此这篇关于Golang中异常处理机制的文章就介绍到这了,更多相关Golang异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
原文链接:https://juejin.cn/post/6970568554689069086