经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
优雅地处理错误真是一门学问啊!
来源:cnblogs  作者:新亮笔记  时间:2021/6/7 9:13:29  对本文有异议

文章目录:

errors

这个大家肯定使用过,标准库的 errors 错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。

  1. // 不带堆栈
  2. err := errors.New("error msg")
  3. fmt.Printf("%+v\n", err)
  4. // 输出
  5. error msg

pkg/errors

github.com/pkg/errors 支持堆栈信息,可以获得错误的调用链详细信息。

普通的

  1. // 带堆栈
  2. err := errors.New("error msg")
  3. fmt.Printf("%+v\n", err)
  4. // 输出
  5. error msg
  6. main.main
  7. /Users/xinliang/go/project/demo/err/err.go:14
  8. runtime.main
  9. /usr/local/go/src/runtime/proc.go:225
  10. runtime.goexit
  11. /usr/local/go/src/runtime/asm_amd64.s:1371

带堆栈,包装描述

  1. err := errors.Wrap(err error, message string)
  2. err := errors.Wrapf(err error, format string, args ...interface{})

带堆栈,不包装描述

  1. err := errors.WithStack(err error)

不带堆栈,包装描述

  1. err := errors.WithMessage(err error, message string)
  2. err := errors.WithMessagef(err error, format string, args ...interface{})

思考

大家想一想,我们在使用 pkg/errors 时,会遇到什么问题?

会遇到重复堆栈的问题!

比如,一个方法的调用链路比较长,就会出现这种情况,举个例子:

  1. func main() {
  2. err := func1()
  3. fmt.Printf("%+v\n", errors.Wrapf(err, "func1 error occurred"))
  4. }
  5. func func1() error {
  6. err := func2()
  7. return errors.Wrapf(err, "func2 error occurred")
  8. }
  9. func func2() error {
  10. err := errors.New("error msg")
  11. return err
  12. }

想想看,会打印出什么?

是不是发现打印出的堆栈信息有重复的?

如何去解决这个问题?快来我的星球交流讨论吧,https://t.zsxq.com/iIUVVnA

原文链接:http://www.cnblogs.com/xinliangcoder/p/14839294.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号