12.1 error 向上抛
本篇学习 Go 中通过 error 返回错误的方式,并能把底层错误包装后向上交给调用方处理。
error 向上抛
概念说明
Go 的常规错误处理方式是返回 error。
函数遇到无法处理的问题时,把错误作为返回值交给调用方,由调用方决定记录、重试、返回响应或中断流程。
这种方式不是自动抛异常。
它更像是把失败结果显式写在函数签名里。
语法/规则
- 约定把
error 放在返回值列表最后。 - 没有错误时返回
nil。 - 调用方使用
if err != nil 处理错误。 - 使用
fmt.Errorf("...: %w", err) 可以包装底层错误。 - 不要忽略关键错误返回值。
向上返回错误示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| package main
import (
"fmt"
"strconv"
)
func parseAge(text string) (int, error) {
age, err := strconv.Atoi(text) // 尝试把字符串转换成 int
if err != nil { // 转换失败时,不在这里硬处理,而是把错误继续向上返回
return 0, fmt.Errorf("parse age: %w", err) // 包装底层错误,补充“parse age”这层上下文
}
return age, nil // 转换成功,返回年龄和 nil 错误
}
func main() {
age, err := parseAge("abc") // 故意传入错误数据,观察错误如何向上返回
if err != nil { // 调用方拿到错误后,决定怎么处理
fmt.Println(err)
return
}
fmt.Println(age)
}
|
输出结果:
1
| parse age: strconv.Atoi: parsing "abc": invalid syntax
|
这里的 strconv.Atoi 是做什么的
在这段代码里:
1
| age, err := strconv.Atoi(text)
|
strconv.Atoi 的作用是:把字符串转换成整数。
例如:
1
2
| strconv.Atoi("18") // 得到 18, nil
strconv.Atoi("abc") // 得到 0, error
|
所以在这个示例中:
- 如果
text 像 "18" 这样是正常数字字符串,就能成功转成整数。 - 如果
text 像 "abc" 这样不是数字,就会返回错误。 parseAge 再把这个底层错误包装成 parse age: ...,继续向上交给调用方处理。
常见错误
- 忽略
err,导致后续逻辑拿着无效数据继续执行。 - 返回错误时丢失上下文,调用方只知道失败,不知道失败发生在哪里。
- 没有错误时返回一个空字符串错误,正确做法是返回
nil。 - 把所有错误都
panic,导致可恢复的业务失败也中断程序。