Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

19 | 错误处理(上)

fmt.Errorf函数
errors.New函数
错误信息的字符串表示形式
判等操作
类型switch语句
类型断言表达式
Error方法
接口类型
错误类型体系
经常用到的错误类型
错误值生成方式
卫述语句
判断错误值
error
思考题
设计方式
错误值处理技巧
错误类型
Go语言错误处理

该思维导图由 AI 生成,仅供参考

提到 Go 语言中的错误处理,我们其实已经在前面接触过几次了。
比如,我们声明过error类型的变量err,也调用过errors包中的New函数。今天,我会用这篇文章为你梳理 Go 语言错误处理的相关知识,同时提出一些关键问题并与你一起探讨。
我们说过error类型其实是一个接口类型,也是一个 Go 语言的内建类型。在这个接口类型的声明中只包含了一个方法ErrorError方法不接受任何参数,但是会返回一个string类型的结果。它的作用是返回错误信息的字符串表示形式。
我们使用error类型的方式通常是,在函数声明的结果列表的最后,声明一个该类型的结果,同时在调用这个函数之后,先判断它返回的最后一个结果值是否“不为nil”。
如果这个值“不为nil”,那么就进入错误处理流程,否则就继续进行正常的流程。下面是一个例子,代码在 demo44.go 文件中。
package main
import (
"errors"
"fmt"
)
func echo(request string) (response string, err error) {
if request == "" {
err = errors.New("empty request")
return
}
response = fmt.Sprintf("echo: %s", request)
return
}
func main() {
for _, req := range []string{"", "hello!"} {
fmt.Printf("request: %s\n", req)
resp, err := echo(req)
if err != nil {
fmt.Printf("error: %s\n", err)
continue
}
fmt.Printf("response: %s\n", resp)
}
}
我们先看echo函数的声明。echo函数接受一个string类型的参数request,并会返回两个结果。
这两个结果都是有名称的,第一个结果response也是string类型的,它代表了这个函数正常执行后的结果值。
第二个结果err就是error类型的,它代表了函数执行出错时的结果值,同时也包含了具体的错误信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言中的错误处理机制是本文的主要内容。作者首先介绍了`error`类型是一个接口类型,其`Error`方法用于返回错误信息的字符串表示形式。然后通过示例代码展示了如何在函数声明中使用`error`类型的结果,并在调用函数后判断错误值是否为`nil`,从而进行错误处理。作者还提到了卫述语句的使用以及生成错误值的方式。在讨论如何判断具体错误类型时,作者指出了对于不同类型的错误值的判断习惯,包括使用类型断言表达式、类型`switch`语句和判等操作。文章深入浅出地介绍了Go语言中的错误处理机制,为读者提供了清晰的概览和实用的技术指导。文章还提到了对于错误值可能代表的含义知之甚少时,可以通过错误值的`Error`方法拿到它的错误信息。总的来说,本文通过实际代码示例和讨论,为读者提供了初步学习错误处理的内容,并分享了Go语言中处理错误的最基本方式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • Felix
    老师,我一直想知道关于io.EOF怎么理解,拿文件来说如果文件读取结束后,为什么是EOF结束,或者说到底什么是EOF.

    作者回复: EOF 就是 End Of File 的缩写。早在 Unix 操作系统诞生之初就有 EOF 这种形式了,它最早象征着文件中内容的结束。由于一些原因,它被很多操作系统和编程语言沿用了。现在的 EOF 的用途已经远不止表示文件的末尾了,它在很多地方都表示某种数据流的末尾。

    2020-04-07
    11
  • 那句诺言
    老师,“该值的静态类型当然是error,而动态类型则是一个在errors包中的,包级私有的类型*errorString”,静态类型和动态类型该怎么理解呢?

    作者回复: 我讲接口的时候讲了啊。

    2018-10-30
    2
    7
  • HiNeNi
    郝老师您好,抱歉最近刚看到18年关于您近况的文章,想问一下您最近怎么样了?身体还好嘛?祝老师身体健康!平安顺遂!

    作者回复: 现在算是稳定了,或者说基本达到了另外一种平衡状态。谢谢关心:)

    2021-04-27
    3
    6
  • 海盗船长
    老师你好,在代码中如何优雅地处理错误呀,有没有办法 不需要在每个方法中处理,集中到一个地方处理?

    作者回复: 基本上是这样,就拿Web系统来说,一般情况下会在系统的最上层(接收request的那一层)统一处理错误。

    2019-03-15
    5
  • 我好像一点都不像程序员
    echo 函数 return 后面的东西呢?

    作者回复: 因为那个函数存在有名称的结果声明,所以在该函数开始执行的时候,作为其结果的变量(如 echo 函数中的 response 变量和 err 变量)就已经自动创建好了。因此,这种函数中的 return 就可以不加任何东西,这时返回的就是那几个结果变量(如 response 和 err)的值。

    2021-03-20
    2
    4
  • 罗峰
    两个err 比较,应该是比较 相应的动态类型以及动态值是不是 完全一样,感觉就是地址的比较把

    作者回复: 是的。不过修正下你说的话,是“两个 error 类型值的比较”,不是“两个 err 比较”。

    2021-06-06
    1
  • Geek_as
    underlyingError函数我还是有点懵逼,多个switch全部都是执行err.Err,那不需要switch直接执行不也可以吗

    作者回复: 这里的underlyingError函数的意思是,参数err的类型只要是*os.PathError、*os.LinkError、*os.SyscallError或*exec.Error中的任意一个的话,就返回err内含的(也就是潜在的)那个错误,否则就把参数err原封不动地返回去。函数如其名,它就是要设法拿到原错误的潜在错误。 当然,你也可以把那些用于判断的类型写到一个case里。我这里是为了在文章中清晰展示,所以把它们分开写了。

    2022-04-19
  • jxs1211
    判断2个接口类型(比如这里error类型的值)的值是否相等,是否就是判断他们的的实际类型和实际值是否相等,验证一下认为不是这样比较的,不是的话,什么情况下是相等的呢

    作者回复: 类型转换之后再比较啊,你可以用类型断言或者 type switch 语句去判断类型。但一般都会有 other(或者说 default)的情况,这需要妥善处理。

    2021-12-01
    3
  • LH
    未知类型的错误真的感觉不太友好

    作者回复: 其实只是不太随大流而已。try...catch...finally的方式代码量也少不到哪里去。不过Go 2会有大幅改进的。

    2019-03-31
  • zs阿帅
    go2设计草案里提到说对于这种error处理的多个卫术语句的简化,利用check,handler简化错误处理的代码量。
    2018-09-24
    1
    20
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部