当前位置: 首页 > article >正文

【golang】go errors 处理错误追踪打印堆栈信息

目录

  • 背景
  • 使用
  • 参考

背景

使用原生go语言编程时,常常需要处理错误,然而golang中没有像java/python等其他语言的try-catch方式一样的方式来处理异常事件,只能通过函数返回值接收并处理错误。
在实践中,由于牛马的不熟练或随意处理错误(比如我),常常在各处打印错误日志,而实际翻找日志时很难定位错误根源。在中大型项目中,业务逻辑错综复杂,日志描述大量重复或者含糊不清,就很难排查问题了。

如果能根据在日志中看到错误的堆栈信息,是不是定位问题就变容易多了?!
https://github.com/pkg/errors 很符合我对错误处理的幻想,甚至比try-catch更方便。

使用

go get github.com/pkg/errors
package main

import (
	"fmt"

	"github.com/pkg/errors"
)

func a(x int) error {
	if x == 2 {
		//return errors.Errorf("error because x is %d", x) //  会记录调用栈
		return errors.New("[a] error because x is 2") // 会记录调用栈
	}
	return nil
}

func b(arr []int) error {
	for _, x := range arr {
		if err := a(x); err != nil {
			return errors.Wrap(err, "[b] failed to handle arr") // 包装,并且记录当前行的调用栈
			//return errors.WithMessage(err, "failed to handle arr") // 只包装,不记录当前行的调用栈
		}
	}
	return nil
}

func c() error {
	err := b([]int{1, 2, 3, 4, 5})
	if err != nil {
		return errors.WithMessage(err, "[c] error") // 只包装,不记录当前行的调用栈
	}
	return nil
}

func main() {
	err := c()
	if err != nil {
		fmt.Println("============================================")
		fmt.Printf("%v\n", err) // 打印错误信息
		fmt.Println("============================================")
		fmt.Printf("%v\n", errors.Cause(err)) // 打印错误根源信息
		fmt.Println("============================================")
		fmt.Printf("%+v\n", err) // 打印错误信息+堆栈信息
		fmt.Println("============================================")
	}
}

stdout:

============================================
[c] error: [b] failed to handle arr: [a] error because x is 2
============================================
[a] error because x is 2
============================================
[a] error because x is 2
main.a
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:12
main.b
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:19
main.c
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:28
main.main
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:36
runtime.main
	/Library/env/goenv/versions/1.21.13/src/runtime/proc.go:267
runtime.goexit
	/Library/env/goenv/versions/1.21.13/src/runtime/asm_arm64.s:1197
[b] failed to handle arr
main.b
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:20
main.c
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:28
main.main
	/Users/jinglong/Projects/my-go-projects/study/test_errors/main.go:36
runtime.main
	/Library/env/goenv/versions/1.21.13/src/runtime/proc.go:267
runtime.goexit
	/Library/env/goenv/versions/1.21.13/src/runtime/asm_arm64.s:1197
[c] error
============================================

参考

https://segmentfault.com/a/1190000045285259


http://www.kler.cn/a/463501.html

相关文章:

  • 数据结构考前一天
  • 【蓝桥杯比赛-C++组-经典题目汇总】
  • 解决uniapp H5页面限制输入框只能输数字问题
  • 计算机网络•自顶向下方法:路由选路算法
  • mysql 死锁案例及简略分析
  • 微信小程序获取后端数据
  • idea 开发Gradle 项目
  • Linux:基础IO
  • HTML入门教程|| HTML 基本标签(2)
  • 第 28 章 - ES 源码篇 - Elasticsearch 启动与插件加载机制解析
  • 【每日学点鸿蒙知识】输入框光标显示问题、web组件回调async问题、图片加载流程监控、背景图片大小不生效问题、alert无效
  • 像素的访问和算术运算
  • 【R语言】校准曲线,绘制原理
  • 游戏关卡设计方法的杂感
  • 【Unity3d】C#浮点数丢失精度问题
  • 如何查询快手IP归属地?如何关闭
  • HTML——46.制作课程表
  • 鸿蒙应用开发 - 如何去掉字符串中空格
  • 使用 `Celery` 与 `RabbitMQ` 实现异步任务队列:构建高效、可靠的任务调度系统
  • 深度学习在光学成像中是如何发挥作用的?
  • [创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较
  • 如何通过深度学习提升大分辨率图像预测准确率?
  • Ajax阶段总结(二维表+思维导图+四种请求方式)
  • 数据库概念(MySQL第一期)
  • MongoDB 固定集合
  • AWTK 在 ESP 上的移植笔记