golang常用库之pkg/errors包第三方错误处理包案例详解

目录
  • golang常用库之-pkg/errors包
    • 背景
    • 关于官方errors包
    • 官方errors包使用demo
    • 什么是pkg/errors包
    • pkg/errors包使用demo
    • 优秀开源项目使用案例
  • 参考

golang常用库之-pkg/errors包

背景

golang自带了错误信息包error

  • 只提供了简单的用法, 如errors.New(),和errors.Error()用来传递和获取错误信息.
  • 明显官方的包已经不能满足了, 只能采取其他方法补救, 如:采用三方errors包。

关于官方errors包

Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 值为 nil,则表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误。

查看golang的errors包你会发现其源码是:

package errors

// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
	return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
	s string
func (e *errorString) Error() string {
	return e.s

New方法通过传入的text创建不同的errorString,这个结构体实现了Error()方法,这样便可以动态的创建不同的错误类型。

New返回了一个实现error接口的errorString类型的指针。 那为啥不是返回errorString的值类型??

我们在调用errors.New("")来返回一个错误时, **可以通过比较指针,来比较error是否相等, 实际上就是控制相同的错误我们只创建一个error对象。**否则对象复制一下,在比较就是false了。

而且指针才会与nil相比较, 如果是字符串"" 虽然错误内容为空,但是还是有错误的。

看过源码我们很清楚的知道内置的error类型包含的信息十分有限

官方errors包使用demo

package main

import (
	"errors"
	"fmt"
)
func main()  {
	err := errors.New("errors!!!!!!!!!!")
	if err != nil {
		fmt.Print(err)
	}
}

什么是pkg/errors包

github.com/pkg/errors

Golang 的 error 不会像 Java 那样打印 stackTrack 信息。回溯 err 很是不方便。

pkg/errors 是一个用的比较多,同时也比较灵活的一个golang 异常处理包,我们基于此包,可以灵活的处理软件开发中的异常

位于github.com/pkg/errors 的errors包是Go标准库的替代品。它提供了一些非常有用的操作用于封装和处理错误。

经过 github.com/pkg/errors 这个包来处理 err,WithStack(err) 函数能够打印 stack

pkg/errors包使用demo

%s,%v //功能一样,输出错误信息,不包含堆栈
%q //输出的错误信息带引号,不包含堆栈
%+v //输出错误信息和堆栈
如:
fmt.Println(fmt.Sprintf("%s", err))
fmt.Println(fmt.Sprintf("%q", err))
fmt.Println(fmt.Sprintf("%+v", err))

注意,使用 log.Errorf("%+v", err) 才会打印 stackTrack,使用 %v %s 不行。

package main

import (
	E "errors"
	"fmt"
	"github.com/pkg/errors"
)
func main() {
	err0 := t1()
	err := errors.Wrap(err0, "附加信息")
	if err != nil {
		//打印错误需要%+v才能详细输出
		fmt.Printf("err :%+v\n", err)
	}
	fmt.Println("Hello world")
}
func t1() error {
	return E.New("错误")

结果:

优秀开源项目使用案例

https://github.com/marmotedu/errors

作者基于 github.com/pkg/errors 包,增加对 error code 的支持,完全兼容 github.com/pkg/errors。

性能跟 github.com/pkg/errors 基本持平。

该 errors 包匹配的错误码设计请参考:marmotedu/sample-code

可以用于web服务 code message json返回效果。
如果返回结果中存在 code 字段,则表示调用 API 接口失败。例如:

{
  "code": 100101,
  "message": "Database error"
}

上述返回中 code 表示错误码,message 表示该错误的具体信息。每个错误同时也对应一个 HTTP 状态码,比如上述错误码对应了 HTTP 状态码 500(Internal Server Error)。

参考

Golang的错误处理
参考URL: https://zhuanlan.zhihu.com/p/89821850

到此这篇关于golang常用库之-pkg/errors包 第三方错误处理包的文章就介绍到这了,更多相关golang pkg/errors包第三方错误处理包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang常用库之配置文件解析库-viper使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 golang常用库:字段参数验证库-validator使用 一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 开发者.总之,他在golang领域是专家,很牛的一个

  • golang常用库之gorilla/mux-http路由库使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:golang自带路由介绍 golang自带路由库 http.ServerMux ,实际上是一个 map[string]Handler,是请求的url路径和该url路径对于的一个处理函数的映射关系.这个实现比较简单,有一些缺点: 不支持参数设定,例如/user/:uid 这种泛型类型匹配无法很友好的支持REST模式,无

  • golang常用库之字段参数验证库-validator使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 golang常用库:字段参数验证库-validator使用 一.背景 在平常开发中,特别是在web应用开发中,为了验证输入字段的合法性,都会做一些验证操作.比如对用户提交的表单字段进行验证,或者对请求的API接口字段进行验证,验证字段的合法性,保证输入字段值的安全,防止用户的恶意请求. 一般的做法是用正则表达式,一个字段

  • golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:"index"` //设置一个普通的索引,没有设置索引名,gorm会自动命名 Birth

  • golang常用库之pkg/errors包第三方错误处理包案例详解

    目录 golang常用库之-pkg/errors包 背景 关于官方errors包 官方errors包使用demo 什么是pkg/errors包 pkg/errors包使用demo 优秀开源项目使用案例 参考 golang常用库之-pkg/errors包 背景 golang自带了错误信息包error 只提供了简单的用法, 如errors.New(),和errors.Error()用来传递和获取错误信息. 明显官方的包已经不能满足了, 只能采取其他方法补救, 如:采用三方errors包. 关于官方e

  • Go依赖注入DI工具wire使用详解(golang常用库包)

    目录 什么是依赖注入 第一次编写mysql操作类: 第二次编写mysql操作类: 第三次编写mysql操作类: 何时使用依赖注入 wire 概念说明 provider 和 injector provider injector wire 使用 快速开始 小结 绑定接口 Provider Set 参考 google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI.

  • JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)

    Apache Arrow是是各种大数据工具(包括BigQuery)使用的一种流行格式,它是平面和分层数据的存储格式.它是一种加快应用程序内存密集型. 数据处理和数据科学领域中的常用库: Apache Arrow.诸如Apache Parquet,Apache Spark,pandas之类的开放源代码项目以及许多商业或封闭源代码服务都使用Arrow.它提供以下功能: 内存计算 标准化的柱状存储格式 一个IPC和RPC框架,分别用于进程和节点之间的数据交换 让我们看一看在Arrow出现之前事物是如何

  • Golang中的错误处理的示例详解

    目录 1.panic 2.包装错误 3.错误类型判断 4.错误值判断 1.panic 当我们执行panic的时候会结束下面的流程: package main import "fmt" func main() { fmt.Println("hello") panic("stop") fmt.Println("world") } 输出: go run 9.go hellopanic: stop 但是panic也是可以捕获的,我们可

  • golang使用 gomodule 在公共测试环境管理go的依赖的实例详解

    背景:调试服务最好的方式就是直接上机实践.对在公司的员工来说,在同一套服务上协同开发比在单独的环境上开发,应该会更有感觉.有问题可以一起发现并解决,也能够一同开发需求. 但是,公司的测试机往往是没办法连外网的,而golang 的大部分工程都需要直接从github 上下载依赖,这就导致 依赖文件需要先提前上传到开发机上.那么当开发机上需要运行多个golang 工程的时候,如何共享这些依赖,减少维护依赖库的工作量呢? 这也是需要大家协作完成的- 最终总结:项目采用 go module + vendo

  • Windows和夜神模拟器上抓包程序mitmproxy的安装使用详解

    目录 windows 一.介绍说明 二.安装以及配置 三.mitmdump的使用 夜神模拟器 一.安装过程 1.准备 2.安装命令,在.mitmproxy目录下运行cmd 3.重命名+推送至手机 4.安装mitm证书到手机adb shell操作: 5.查看是否成功: ** windows ** 一.介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能,只不过它是一个控制台的形式操作. mitmproxy还有两个关联组件.一个是mitmd

随机推荐