文档章节

golang 1.13 errors 包 新函数介绍

guonaihong
 guonaihong
发布于 10/15 09:21
字数 526
阅读 103
收藏 1
Go

这次 errors 包算重量级更新。很有更能把以前的一些设计模式给推到。下面聊下用法。

error 装包

以前返回一个错误,想要保存 error 链,还要定义结构体保存以前的 error 信息。感兴趣看下 syscal.ECONNREFUSED 如何封装到 url.Error 的。现在只要%w 就行

err = fmt.Errorf("第二层错误信息 %w", err)

error 解包

如果是 fmt.Errorf("%w", err) 定义的错误链可以通过,或者实现了Unwrap接口的错误

e = errors.Unwrap(e) //解包错误

装包解包需要注意的地方

装包和解包错误是一一对应的,一次 Unwrap 调用,解一次 fmt.Errorf("%w", err)调用

package main

import (
    "errors"
    "fmt"
)

func main() {

    var e, first error

    first = errors.New("head")

    e = fmt.Errorf("第一层错误:%w", first)
    e = fmt.Errorf("第二层错误:%w", e)
    e = fmt.Errorf("第三层错误:%w", e)
    e = fmt.Errorf("第四层错误:%w", e)

    //解包错误
    e = errors.Unwrap(e)
    fmt.Printf("%s\n", e)

    //解包错误
    e = errors.Unwrap(e)
    fmt.Printf("%s\n", e)

    //解包错误
    e = errors.Unwrap(e)
    fmt.Printf("%s\n", e)

    //解包错误
    e = errors.Unwrap(e)
    fmt.Printf("%s\n", e)
}

/*
第三层错误:第二层错误:第一层错误:head
第二层错误:第一层错误:head
第一层错误:head
head

*/

判断错误是否相等

过去写法 ==

if err == os.ErrNotExistF {

}

现在写法 errors.Is

以前只有一个错误,现在是错误链表,要通过 errors.Is 遍历判断

b := errors.Is(err, os.ErrNotExist)
fmt.Printf("%t\n", b)

新写法根据具体类型判断 errors.As

errors.As和errors.Is的区别,主要是取出这种类型的错误

 if _, err := os.Open("non-existing"); err != nil {
        var pathError *os.PathError
        if errors.As(err, &pathError) {
            fmt.Println("Failed at path:", pathError.Path)
        } else {
            fmt.Println(err)
        }
    }

交流学习

errors 包的一些姿势还要等长时间使用才能完全开发出来,欢迎 朋友提出想法,一起学习。

github

https://github.com/guonaihong/gout

© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
加载中

评论(4)

喊你莫挨老子
喊你莫挨老子
errorsas是啥意思
guonaihong
guonaihong 博主
errors.As是error链里面取出 某个实现error接口的类型。 比如标准库http.Get(url)返回的错误,err 是个错误链,具体实现是 *url.Error 里面包了*net.OpError ,*net.OpError里面包了*os.SyscallError。 要从err取出os.SyscallError 。传统方式是,一个类型接着一个类型断言。go 1.13直接errors.As就行。可以理解为 从err query出这个类型。 ```go package main import ( "errors" "fmt" "net/http" "os" ) func main() { var e *os.SyscallError _, err := http.Get("http://127.0.0.1:3333") if errors.As(err, &e) { fmt.Printf("%s\n", e.Syscall) } } ```
喊你莫挨老子
喊你莫挨老子
哦懂了意思就是不需要一层一层的来剥开错误。直接用这个函数来得到错误。谢了。。
guonaihong
guonaihong 博主
是的。。。😄
年终盘点!2017年超有价值的Golang文章

年终盘点!2017年超有价值的Golang文章 鸟窝2017-12-281 阅读 Go 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍。 文章排名部分先后...

鸟窝
2017/12/28
0
0
Golang开发支持平滑升级(优雅重启)的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势...

一曲
2016/12/15
648
0
085-包的匿名导入(Blank Import)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/83211726 转眼间,Golang 的博客从春天写到了冬天,现在我们又回到了原点,不忘...

--Allen--
2018/10/20
0
0
Go语言学习笔记 package

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 strings strings包实现了用于操作字符的简单函数。 strings.Index("suoning", "n") //3(子串第一次出现的位置,不存在则返回...

xumaojun
2018/03/12
0
0
『Go 语言学习专栏』-- 第五期

大家好,我叫谢伟,是一名程序员。 我正在着手扎实学习 golang , 这个专栏是我的输出整理文章。 希望能带有心人一起学习 golang , 力求从入门到中级程序员水平。 我们已经研究了: Golang 环...

谢小路
2018/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 部署 redis 5.0.6 集群

环境 操作系统: CentOS7.7,关闭 firewalld 和 selinux Redis: 5.0.6 master 实例 10.0.4.110:6371 10.0.4.110:6372 10.0.4.110:6373 slave 实例 10.0.4.111:6371 10.0.4.111:6372 10.0.4.1......

俊赛潘安-才比管乐
13分钟前
16
0
怎么录制电脑上视频素材的声音

随着短视频的不断发展人们越来越喜欢利用空闲时间观看一些短视频用以打发零碎的时间,不少人发现这个机遇也匆匆走上制作短视频的道路,在制作短视频时配音是至关重要的,那你知道怎么在视频素...

cenfeng123
22分钟前
4
0
[springboot 开发单体web shop] 6. 商品分类和轮播广告展示

商品分类&轮播广告 因最近又被困在了OSGI技术POC,更新进度有点慢,希望大家不要怪罪哦。 上节 我们实现了登录之后前端的展示,如: 接着,我们来实现左侧分类栏目的功能。 商品分类|Produc...

IsaacZhang
22分钟前
3
0
java 静态代码块,代码块,构造方法执行顺序

回顾一下java的执行顺序 public class Demo { public Demo() { super(); System.out.println("this is Demo"); } static { System.out.println("this is static"); } { System.out.println("......

漫步行者
41分钟前
7
0
滴滴面试题答案思路

1.mysql 1.1.介绍下介绍下innodb的索引类型、数据结构 普通索引,唯一索引,主键索引:也就是聚簇索引,全文索引(FULLTEXT),聚集索引,非聚集索引等。 数据结构B+树: B+树特点 1.矮胖型,...

指尖Coding
44分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部