优雅地处理错误真是一门学问啊!
errors
这个大家肯定使用过,标准库的 errors
错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。
// 不带堆栈
err := errors.New("error msg")
fmt.Printf("%+v\n", err)
// 输出
error msg
pkg/errors
github.com/pkg/errors
支持堆栈信息,可以获得错误的调用链详细信息。
普通的
// 带堆栈
err := errors.New("error msg")
fmt.Printf("%+v\n", err)
// 输出
error msg
main.main
/Users/xinliang/go/project/demo/err/err.go:14
runtime.main
/usr/local/go/src/runtime/proc.go:225
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1371
带堆栈,包装描述
err := errors.Wrap(err error, message string)
或
err := errors.Wrapf(err error, format string, args ...interface{})
带堆栈,不包装描述
err := errors.WithStack(err error)
不带堆栈,包装描述
err := errors.WithMessage(err error, message string)
或
err := errors.WithMessagef(err error, format string, args ...interface{})
思考
大家想一想,我们在使用 pkg/errors
时,会遇到什么问题?
会遇到重复堆栈的问题!
比如,一个方法的调用链路比较长,就会出现这种情况,举个例子:
func main() {
err := func1()
fmt.Printf("%+v\n", errors.Wrapf(err, "func1 error occurred"))
}
func func1() error {
err := func2()
return errors.Wrapf(err, "func2 error occurred")
}
func func2() error {
err := errors.New("error msg")
return err
}
想想看,会打印出什么?
是不是发现打印出的堆栈信息有重复的?
如何去解决这个问题?快来我的星球交流讨论吧,https://t.zsxq.com/iIUVVnA
新亮笔记
技术的深度和广度只能靠自己努力去发掘,谁也不能替你学习,在这里希望你能有所收获。
推荐阅读
关于项目中 Repository 层的思考
维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。
新亮赞 2阅读 1.8k评论 1
一个HTTP请求的曲折经历
作为程序员的我们每天都在和网络请求打交道,而前端程序员接触的最多的就是HTTP请求。平时工作中,处理网络请求之类的操作是最多的了。但是一个请求从客户端发出到被服务端处理、再回送响应,再被客户端接收这一...
nero赞 24阅读 5.1k评论 1
Nginx 一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增...
民工哥赞 23阅读 1.1k
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。
机器铃砍菜刀赞 24阅读 58.5k评论 2
最好用的 python 库合集
🎈 分词 - jieba优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 {代码...} 🎈 词云库 - wordcloud对数据中出现频率较高的 关键词 生成的一幅图像,予以视觉上的突出 {代码...} 🎈 ...
tiny极客赞 11阅读 2.9k评论 2
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~
程序员大彬赞 14阅读 1.9k
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...
JavaGuide赞 8阅读 1.8k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。