前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊golang的error包装

聊聊golang的error包装

作者头像
code4it
发布2020-12-11 10:31:38
3560
发布2020-12-11 10:31:38
举报
文章被收录于专栏:码匠的流水账

本文主要研究一下golang的error包装

error

代码语言:javascript
复制
type error interface {
    Error() string
}

error接口定义了Error方法,返回string

runtime.Error

代码语言:javascript
复制
package runtime

type Error interface {
    error
    // and perhaps other methods
}

对于panic,产生的则是runtime.Error,该接口内嵌了error接口

wrap

代码语言:javascript
复制
package main

import (
    "errors"
    "fmt"

    pkgerr "github.com/pkg/errors"
)

func main() {
    if err := methodA(false); err != nil {
        fmt.Printf("%+v", err)
    }
    if err := methodA(true); err != nil {
        fmt.Printf("%+v", err)
    }
}

func methodA(wrap bool) error {
    if err := methodB(wrap); err != nil {
        if wrap {
            return pkgerr.Wrap(err, "methodA call methodB error")
        }
        return err
    }
    return nil
}

func methodB(wrap bool) error {
    if err := methodC(); err != nil {
        if wrap {
            return pkgerr.Wrap(err, "methodB call methodC error")
        }
        return err
    }
    return nil
}

func methodC() error {
    return errors.New("test error stack")
}

使用内置的errors,则没办法打印堆栈;使用pkg/errors可以携带堆栈

输出

代码语言:javascript
复制
test error stack
test error stack
methodB call methodC error
main.methodB
        /error-demo/error_wrap.go:33
main.methodA
        /error-demo/error_wrap.go:21
main.main
        /error-demo/error_wrap.go:15
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1374
methodA call methodB error
main.methodA
        /error-demo/error_wrap.go:23
main.main
        /error-demo/error_wrap.go:15
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1374% 

小结

  • error接口定义了Error方法,返回string;对于panic,产生的则是runtime.Error,该接口内嵌了error接口
  • 使用内置的errors,则没办法打印堆栈;使用pkg/errors可以携带堆栈

doc

  • Errors
  • pkg/errors
  • Embedding Interfaces in Go (Golang)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • error
  • runtime.Error
  • wrap
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档