首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊golang的error增强

聊聊golang的error增强

作者头像
code4it
发布2020-12-11 10:32:14
发布2020-12-11 10:32:14
31400
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下golang的error增强

Errors in Go 1.13

golang的1.13版本对error进行了增强,主要是

  • 引入了Unwrap方法
  • 增加Is和As方法
  • fmt.Errorf支持%w来包装error

实例

代码语言:javascript
代码运行次数:0
运行
复制
package main

import (
    "errors"
    "fmt"
    "os"
)

var DemoErr = errors.New("test error stack")

// https://itnext.io/golang-error-handling-best-practice-a36f47b0b94c
func main() {
    if err := methodA(false); err != nil {
        fmt.Printf("%+v\n", err)
    }

    if err := methodA(true); err != nil {
        fmt.Printf("%+v\n", err)
        fmt.Printf("%+v\n", errors.Unwrap(err))
        fmt.Printf("%+v\n", errors.Unwrap(errors.Unwrap(err)))

        fmt.Println("errors.Is(err, DemoErr)=", errors.Is(err, DemoErr))
        fmt.Println("errors.As(err, &DemoErr)=", errors.As(err, &DemoErr))

        var pe *os.PathError
        fmt.Println("errors.Is(err, pe)=", errors.Is(err, pe))
        fmt.Println("errors.As(err, &pe)=", errors.As(err, &pe))
    }
}

func methodA(wrap bool) error {
    if err := methodB(wrap); err != nil {
        if wrap {
            return fmt.Errorf("methodA call methodB error: %w", err)
        }
        return err
    }
    return nil
}

func methodB(wrap bool) error {
    if err := methodC(); err != nil {
        if wrap {
            return fmt.Errorf("methodB call methodC error: %w", err)
        }
        return err
    }
    return nil
}

func methodC() error {
    return DemoErr
}

输出

代码语言:javascript
代码运行次数:0
运行
复制
test error stack
methodA call methodB error: methodB call methodC error: test error stack
methodB call methodC error: test error stack
test error stack
errors.Is(err, DemoErr)= true
errors.As(err, &DemoErr)= true
errors.Is(err, pe)= false
errors.As(err, &pe)= false

小结

  • wrap对error进行了包装,不过没有包含堆栈
  • Is会挨个unwrap去对error进行判断errors.Is function behaves like a comparison to a sentinel error
  • As类似类型断言errors.As function behaves like a type assertion

doc

  • Errors
  • Working with Errors in Go 1.13
  • Error Handling in Go 1.13
  • Proposal: Go 2 Error Inspection
  • Golang error浅析
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Errors in Go 1.13
  • 实例
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档