章节

12.1 error 向上抛

本篇学习 Go 中通过 error 返回错误的方式,并能把底层错误包装后向上交给调用方处理。

error 向上抛

概念说明

Go 的常规错误处理方式是返回 error
函数遇到无法处理的问题时,把错误作为返回值交给调用方,由调用方决定记录、重试、返回响应或中断流程。

这种方式不是自动抛异常。
它更像是把失败结果显式写在函数签名里。

语法/规则

  1. 约定把 error 放在返回值列表最后。
  2. 没有错误时返回 nil
  3. 调用方使用 if err != nil 处理错误。
  4. 使用 fmt.Errorf("...: %w", err) 可以包装底层错误。
  5. 不要忽略关键错误返回值。

向上返回错误示例

 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

所以在这个示例中:

  1. 如果 text"18" 这样是正常数字字符串,就能成功转成整数。
  2. 如果 text"abc" 这样不是数字,就会返回错误。
  3. parseAge 再把这个底层错误包装成 parse age: ...,继续向上交给调用方处理。

常见错误

  1. 忽略 err,导致后续逻辑拿着无效数据继续执行。
  2. 返回错误时丢失上下文,调用方只知道失败,不知道失败发生在哪里。
  3. 没有错误时返回一个空字符串错误,正确做法是返回 nil
  4. 把所有错误都 panic,导致可恢复的业务失败也中断程序。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字