从Go 1.13起,errors包支持通过%w包装错误,形成可追溯的错误链,使用errors.Unwrap解包,errors.Is和errors.As判断和提取特定错误,提升错误处理与调试能力。

在Go语言中,从1.13版本开始,errors 包引入了对错误包装(error wrapping)的支持,允许你将一个错误“包装”进另一个错误中,同时保留原始错误的信息。这种机制非常适合实现错误的链式包装,便于追踪错误源头并添加上下文信息。
在调用 fmt.Errorf 时,使用 %w 动词可以将一个已有错误包装到新错误中:
示例代码:
package main
import (
"errors"
"fmt"
)
func readFile() error {
return fmt.Errorf("读取文件失败: %w", errors.New("文件不存在"))
}
func processFile() error {
return fmt.Errorf("处理文件时出错: %w", readFile())
}
func main() {
err := processFile()
fmt.Println(err) // 输出:处理文件时出错: 读取文件失败: 文件不存在
}
Go 提供了安全的方式来检查错误链中是否包含特定错误:
立即学习“go语言免费学习笔记(深入)”;
示例:
if errors.Is(err, os.ErrNotExist) {
fmt.Println("文件不存在")
}
var pathErr *os.PathError
if errors.As(err, &pathErr) {
fmt.Printf("路径错误: %v\n", pathErr.Path)
}
你可以逐层包装错误,形成清晰的调用链:
err := errors.New("数据库连接失败")
err = fmt.Errorf("服务启动失败: %w", err)
err = fmt.Errorf("系统初始化失败: %w", err)
// 使用 errors.Unwrap 可逐层解开
for current := err; current != nil; current = errors.Unwrap(current) {
fmt.Println(current)
}
基本上就这些。只要使用 %w 包装、配合 Is/As 检查,就能在Go中高效管理错误链,提升调试和日志能力。
以上就是如何在Golang中对错误进行链式包装的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号