Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

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-21
    1
    9
  • 无风
    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-19
    4
    3
  • Geek_cd4ae5
    包装错误是不是可以用自带的wrapping error fmt.Errorf("%w")
    2021-01-19
    1
    3
  • 小来子
    一些业务错误为什么不用panic呢?
    2021-01-09
    10
    3
  • 二凡
    panic+recover
    2021-01-09
    2
    1
  • vlanger_~
    👍
    2021-01-08
    1
  • 陈麒文
    打卡
    2022-11-08归属地:福建
  • neohope
    当年为了异常处理,微软还自己做了一套SEH,适用于C: 抛出异常: RaiseException 处理异常: __try{} __except(){} __finally{} __leave
    2021-03-10
  • 小匚
    回想一次上线,代码在水晶球平台网页版运行,后端有用到spark。内存分配不够,理论上节点应该显示执行异常。但是Python用try except了,没有打印出错信息,节点还会显示执行成功,但是没有跑成功,只能查看日志来找错误。当时的解释是水晶球平台分配的内存不够超出程序之外了,只能用另一个人造错误让节点认为它错了。或者在init部分raise Exception。 当时机房里的Java出身大哥们都在吐槽为什么Python没有catch到异常、异常了为什么还能执行,现在理解了Java的异常逻辑。Go把结果和异常都一起返回,也很方便定位。细节还要再仔细看看
    2021-01-09
  • 橙子888
    打卡。
    2021-01-08
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部