zoukankan      html  css  js  c++  java
  • Go 里的错误得这样写才优雅~

    error

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

    // 不带堆栈
    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
    }

    想想看,会打印出什么?

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

  • 相关阅读:
    ASCII码表
    DropDownListSelectedByValue();替代SelectedValue=string
    得到str1在str2中出现的次数 GetCountInStr(string str1,string str2)
    Framework 1.1 和 2.0(Bate)兼容性(2)
    服务没有及时响应启动或控制请求
    LoadControl加载控件要注意的两点
    ADO.Net Entity Framework之EDM应注意
    扩展CheckBoxFieldPro
    对Url的QueryString操作的两个函数
    MS SQL的日志
  • 原文地址:https://www.cnblogs.com/kcxg/p/15044106.html
Copyright © 2011-2022 走看看