zoukankan      html  css  js  c++  java
  • 优雅地处理错误真是一门学问啊!

    文章目录:

    errors

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

    // 不带堆栈
    err := errors.New("error msg")
    fmt.Printf("%+v
    ", err)
    
    // 输出
    error msg
    

    pkg/errors

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

    普通的

    // 带堆栈
    err := errors.New("error msg")
    fmt.Printf("%+v
    ", 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
    ", 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

    作者:新亮笔记(关注公众号,可申请添加微信好友)
    出处:https://www.cnblogs.com/xinliangcoder
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    专业英语阅读(二)
    专业英语阅读(一)
    高精度运算
    高精度运算——加减乘除阶乘
    python常见编程面试题汇总
    python线程
    反射
    单例模式
    生成器、迭代器
    python装饰器
  • 原文地址:https://www.cnblogs.com/xinliangcoder/p/14839294.html
Copyright © 2011-2022 走看看