02 | Go 编程模式:错误处理
陈皓
你好,我是陈皓,网名左耳朵耗子。
错误处理一直是编程必须要面对的问题。错误处理如果做得好的话,代码的稳定性会很好。不同的语言有不同的错误处理的方式。Go 语言也一样,这节课,我们来讨论一下 Go 语言的错误出处,尤其是那令人抓狂的 if err != nil 。
在正式讨论“Go 代码里满屏的 if err != nil 怎么办”这件事儿之前,我想先说一说编程中的错误处理。
C 语言的错误检查
首先,我们知道,处理错误最直接的方式是通过错误码,这也是传统的方式,在过程式语言中通常都是用这样的方式处理错误的。比如 C 语言,基本上来说,其通过函数的返回值标识是否有错,然后通过全局的 errno 变量加一个 errstr 的数组来告诉你为什么出错。
为什么是这样的设计呢?道理很简单,除了可以共用一些错误,更重要的是这其实是一种妥协,比如:read()、 write()、 open() 这些函数的返回值其实是返回有业务逻辑的值,也就是说,这些函数的返回值有两种语义:
一种是成功的值,比如 open() 返回的文件句柄指针 FILE* ;
另一种是错误 NULL。这会导致调用者并不知道是什么原因出错了,需要去检查 errno 以获得出错的原因,从而正确地处理错误。
一般而言,这样的错误处理方式在大多数情况下是没什么问题的,不过也有例外的情况,我们来看一下下面这个 C 语言的函数:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Go语言中的错误处理方式是本文的重点。文章首先回顾了C语言和Java语言中的错误处理方式,然后重点讨论了Go语言中的错误处理模式。通过支持多返回值的方式,Go语言将业务语义和控制语义分离,使函数接口语义更清晰。此外,Go语言的错误处理方式也兼顾了异常的一些好处,可以对错误进行扩展。文章还提到了不同编程语言中的资源清理方式,指出Go语言使用`defer`关键词进行资源清理。总的来说,Go语言的错误处理方式在保持简洁性的同时,兼顾了灵活性和清晰的接口语义,为编程提供了更好的稳定性和可读性。 此外,文章还介绍了一些优化错误处理的方式,如使用函数式编程的方式和包装错误。通过示例代码展示了如何通过结构体和成员函数简化错误处理,以及如何包装错误并添加执行上下文。最后,文章提到了第三方库`github.com/pkg/errors`,该库提供了标准的错误包装和访问方法,进一步简化了错误处理过程。 总的来说,本文通过深入讨论Go语言中的错误处理方式,为读者提供了优化错误处理的方法和工具,帮助他们提高代码的稳定性和可读性。
该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- 周维宇用闭包方式实现的parser,会不会导致第一次调用paser产生的err传递到第二次调用?2021-01-2119
- 无风func parse(input io.Reader) (*Point, error) { var p Point r := Reader{r: input} r.read(&p.Longitude) r.read(&p.Latitude) r.read(&p.Distance) r.read(&p.ElevationGain) r.read(&p.ElevationLoss) if r.err != nil { return nil, r.err } return &p, nil } 这种处理方式只能获得最后一个err...2021-01-1943
- Geek_cd4ae5包装错误是不是可以用自带的wrapping error fmt.Errorf("%w")2021-01-1913
- 小来子一些业务错误为什么不用panic呢?2021-01-09103
- 二凡panic+recover2021-01-0921
- vlanger_~👍2021-01-081
- 陈麒文打卡2022-11-08归属地:福建
- neohope当年为了异常处理,微软还自己做了一套SEH,适用于C: 抛出异常: RaiseException 处理异常: __try{} __except(){} __finally{} __leave2021-03-10
- 小匚回想一次上线,代码在水晶球平台网页版运行,后端有用到spark。内存分配不够,理论上节点应该显示执行异常。但是Python用try except了,没有打印出错信息,节点还会显示执行成功,但是没有跑成功,只能查看日志来找错误。当时的解释是水晶球平台分配的内存不够超出程序之外了,只能用另一个人造错误让节点认为它错了。或者在init部分raise Exception。 当时机房里的Java出身大哥们都在吐槽为什么Python没有catch到异常、异常了为什么还能执行,现在理解了Java的异常逻辑。Go把结果和异常都一起返回,也很方便定位。细节还要再仔细看看2021-01-09
- 橙子888打卡。2021-01-08
收起评论