在go语言中,错误处理应优先使用标准库的errors包和自定义错误类型。1. 使用errors.new定义静态错误值,避免字符串拼接以确保可比较性;2. 调用errors.is判断特定错误,而非通过字符串比较;3. 需要添加上下文信息时,使用fmt.errorf的%w格式包装错误,以便保留错误链并能被unwrap解析;4. 自定义错误类型实现error接口,可携带结构化信息便于分类和展示;5. 实际开发中建议统一错误结构、避免过度包装、谨慎使用哨兵错误,并在日志中记录上下文信息,同时在单元测试中验证错误行为。

在Go语言中,错误处理是日常开发中最常见的操作之一。相比其他语言使用异常机制(try/catch),Go选择用返回值来显式处理错误,这种方式虽然更直观、可控性强,但也对开发者提出了更高的要求:如何写出清晰、可维护的错误处理代码?

答案其实就藏在标准库的
errors
Go 的
errors
errors.New()
errors.Unwrap()
fmt.Errorf()
立即学习“go语言免费学习笔记(深入)”;

最常见的做法是预先定义一些错误变量:
var ErrInvalidInput = errors.New("invalid input")然后在函数中直接返回这个错误:

func validate(n int) error {
if n < 0 {
return ErrInvalidInput
}
return nil
}调用者可以用
errors.Is()
if err := validate(-1); err != nil {
if errors.Is(err, ErrInvalidInput) {
fmt.Println("捕获到无效输入错误")
}
}关键点:
errors.New
errors.Is
err.Error() == "xxx"
fmt.Errorf
有时候我们希望在传递错误的同时加上更多信息,比如“读取配置失败”,而不是只返回底层的
os.ErrNotExist
这时候可以使用
fmt.Errorf
%w
func readConfig() error {
_, err := os.ReadFile("config.json")
if err != nil {
return fmt.Errorf("read config failed: %w", err)
}
return nil
}外层调用者仍然可以通过
errors.Is()
if errors.Is(err, os.ErrNotExist) {
// 即使被包装过也能识别出来
}注意:
%w
Unwrap()
%w
除了使用标准库提供的基础错误,你还可以通过实现
error
举个例子:
type MyError struct {
Code int
Message string
}
func (e MyError) Error() string {
return e.Message
}然后你可以根据不同的业务场景返回不同结构的错误:
func process(data string) error {
if data == "" {
return MyError{Code: 400, Message: "empty input"}
}
return nil
}调用方可以使用类型断言获取详细信息:
if err := process(""); err != nil {
if myErr, ok := err.(MyError); ok {
fmt.Printf("错误码:%d,提示:%s\n", myErr.Code, myErr.Message)
}
}适用场景:
error
%w
io.EOF
基本上就这些。错误处理看起来简单,但要做到既清晰又实用,还是需要一点设计意识的。
以上就是Golang中error处理的最佳实践是什么 详解errors包与自定义错误类型的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号