Golang中异常处理机制详解

作者:zchanglin 时间:2024-02-17 17:05:50 

前言

通常我们需要编写好的错误处理方式,在了避免某些程序员滥用异常,于是Go这里直接把异常这一块给砍掉了,最终还是通过返回值来判断程序的异常情况,毕竟Go可是支持多返回值的语言,比如atoi、itoa等函数,就不能忽略它的第二个返回值,因为第二个返回值代表了转换是否成功!不过Golang还是提供了一些错误处理机制的

Golang中异常处理机制详解

Go的错误机制

1、没有异常机制

2、error类型实现了error接口

3、可以通过errors.New来快速创建错误实例


type error interface{
   Error() string
}

error.New("n must be in range[0, 1]")

Golang中异常处理机制详解

但是这样做只是给开发者标识,Code怎么认识呢?难道去string里判断吗?当然不是,可以预定义一些错误:

Golang中异常处理机制详解

处理错误最佳实践

1、预定义错误,code里判断

2、及早失败,避免嵌套

panic与recover

panic用于不可恢复的错误,类似于Java的Error
panic退出前会执行defer指定的内容

panic和os.Exit
os.Exit退出时不会调用defer指定的函数
os.Exit退出时不会输出当前调用栈信息

Golang中异常处理机制详解

接下来看看recover

在Java中如果你不知道要抛出什么错误,于是乎很多人直接来个Catch Throwable,作为一个异常无Fack说,C++中是直接catch…作为一个异常无Fack说

Golang中异常处理机制详解

在Go语言中可以通过defer定义的函数去执行一些错误恢复的行为

Golang中异常处理机制详解

很多人容易在defer处理错误时把recover获得的错误对象打印到日志文件中,这是一种非常危险的做法,一定要当心recover在做的事情,因为recover的时候并不去检测到底发生了什么错误,而是直接忽略了这个错误,那么如果这个时候系统的核心资源消耗完了,如果我们强制性的恢复的话系统仍然是不能正常工作的,还会导致我们的健康检查程序没办法检查出当前系统的问题,因为很多的health check只是检查进程在还是不在,因为我们的进程是在的,所以会导致僵尸服务进程,虽然活着但是无法正常提供服务。于是我们可以采用恢复设计模式中的一种叫做Let it Crash ,health check进程就会帮我们重启这个服务

Golang中异常处理机制详解

总结

来源:https://juejin.cn/post/6970568554689069086

标签:golang,异常,错误
0
投稿

猜你喜欢

  • Anaconda最新版2023安装教程Spyder安装教程图文详解

    2021-12-24 00:29:56
  • Python 错误和异常代码详解

    2022-02-12 15:14:08
  • 详解vue中的computed的this指向问题

    2024-04-27 15:46:56
  • Python命令行定时任务自动化工作流程

    2023-01-01 20:52:51
  • 深入了解MySQL的数据类型以及建库策略

    2008-12-17 16:16:00
  • php事务处理实例详解

    2024-05-13 09:25:30
  • Python读取Excel数据实现批量生成合同

    2022-08-15 02:12:12
  • 在CentOS系统上从零开始搭建WordPress博客的全流程记录

    2024-04-28 09:19:26
  • 讲述SQL Server数据转换服务小妙招

    2010-07-26 14:43:00
  • Python使用中文正则表达式匹配指定中文字符串的方法示例

    2021-11-28 22:17:00
  • Mysql常见的慢查询优化方式总结

    2024-01-26 02:17:04
  • Python实现AI自动抠图实例解析

    2021-12-25 11:04:22
  • Go爬虫(http、goquery和colly)详解

    2024-05-08 10:52:43
  • golang图片处理库image基本操作

    2024-04-26 17:32:04
  • MySQL 的模块不能安装的解决方法

    2024-01-29 13:15:36
  • MySQL从命令行导入SQL脚本时出现中文乱码的解决方法

    2024-01-27 11:04:46
  • python 用opencv调用训练好的模型进行识别的方法

    2022-11-14 11:57:23
  • PHP中使用BigMap实例

    2024-05-22 10:07:02
  • python config文件的读写操作示例

    2022-04-05 07:42:11
  • 教你如何在Mac上安装mysql数据库

    2024-01-23 05:19:10
  • asp之家 网络编程 m.aspxhome.com