首页 > 后端开发 > Golang > 正文

Golang错误包装与堆栈信息打印示例

P粉602998670
发布: 2025-10-03 09:01:02
原创
806人浏览过
Go 1.13+通过fmt.Errorf("%w")支持错误包装,errors.Is和errors.As用于判断和解包;结合pkg/errors的Wrap、WithStack可记录堆栈,推荐底层返回具体错误,中间层用Wrap加上下文与堆栈,顶层用%+v输出完整信息。

golang错误包装与堆栈信息打印示例

在Go语言中,错误处理是程序健壮性的重要组成部分。从Go 1.13开始,标准库引入了错误包装(error wrapping)机制,允许你将一个错误“包装”进另一个错误中,同时保留原始错误信息。结合第三方库如 pkg/errors,还能方便地记录堆信息,帮助定位问题。

标准库中的错误包装(Go 1.13+)

Go 1.13 在 fmterrors 包中加入了对错误包装的支持:

  • 使用 fmt.Errorf("%w", err) 可以包装错误
  • 使用 errors.Is 判断错误是否匹配某个目标
  • 使用 errors.As 将错误链解包为特定类型

示例代码:

package main

import (
  "errors"
  "fmt"
)

func readFile() error {
  return fmt.Errorf("read file failed: %w", errors.New("file not found"))
}

func processFile() error {
  return fmt.Errorf("process file error: %w", readFile())
}

func main() {
  err := processFile()
  if err != nil {
    fmt.Printf("Error: %v\n", err)
    if errors.Is(err, errors.New("file not found")) {
      fmt.Println("Caught specific error: file not found")
    }
  }
}

输出:

立即学习go语言免费学习笔记(深入)”;

Error: process file error: read file failed: file not found
Caught specific error: file not found

使用 pkg/errors 记录堆栈信息

标准库不自动记录调用堆栈。github.com/pkg/errors 提供了 errors.WithStack()errors.Wrap() 来附加堆栈信息。

安装:

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

微信 WeLM 33
查看详情 微信 WeLM
go get github.com/pkg/errors

示例代码:

package main

import (
  "fmt"
  "github.com/pkg/errors"
)

func readConfig() error {
  return errors.New("config not found")
}

func loadConfig() error {
  return errors.WithStack(readConfig())
}

func runApp() error {
  return errors.Wrap(loadConfig(), "failed to load config")
}

func main() {
  err := runApp()
  if err != nil {
    fmt.Printf("Error: %+v\n", err)
  }
}

输出(包含堆栈):

Error: failed to load config: config not found
github.com/pkg/errors.(*withStack).Wrapf
  .../pkg/errors/errors.go:279
main.loadConfig
  .../main.go:14
main.runApp
  .../main.go:18
main.main
  .../main.go:23

%+v 会打印完整的堆栈跟踪,而 %v 只显示错误消息链。

结合使用标准库与 pkg/errors 的建议

如果你希望兼容标准库的 errors.Iserrors.As,同时保留堆栈,pkg/errors 也提供了兼容方式:

  • 使用 errors.Wrap(err, msg) 包装错误并加堆栈
  • 使用 errors.WithMessage(err, msg) 添加上下文但不加堆栈
  • %+v 输出完整堆栈,%v 输出简洁信息

实际项目中推荐:

  • 底层返回具体错误(如 errors.New 或自定义类型)
  • 中间层使用 errors.Wrap 添加上下文和堆栈
  • 顶层统一打印或日志输出使用 fmt.Printf("%+v")
基本上就这些。错误包装加堆栈能显著提升排查效率,尤其在多层调用场景下。

以上就是Golang错误包装与堆信息打印示例的详细内容,更多请关注php中文网其它相关文章!

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号