golang常用库之pkg/errors包第三方错误处理包案例详解
作者:西京刀客 发布时间:2024-02-14 09:20:38
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
来源:https://blog.csdn.net/inthat/article/details/123577248
猜你喜欢
- 前段时间在生活中偶尔需要对某些文件进行重命名,而且是随机名字,刚开始是手动重命名然后在键盘上胡乱打一些字母数字,时间长了发现也挺麻烦的,于是
- 目录前期准备界面编写截图功能实现OCR实现内容显示总结前期准备在这个阶段主要准备整个小程序的结构,既然要实现ocr,那么输入就是一张图片,而
- 10线程同时操作,频繁出现插入同样数据的问题。虽然在插入数据的时候使用了: insert inti tablename(fields....
- 前言有的时候我们在查看数据库数据时,会看到乱码。实际上,无论何种数据库只要出现乱码问题,这大多是由于数据库字符集设定的问题。下面我们就介绍一
- 如下所示:>>> import numpy as np>>> a = np.array([[1, 2,
- 本文介绍基于Python中ArcPy模块,对大量不同时相的栅格遥感影像按照其成像时间依次执行批量拼接的方法。在前期的文章Python arc
- 语法:replace(self, to_replace=None, value=None, inplace=False, limit=Non
- 引言借由本篇文章来探讨下在Mysql数据库中数值类型tinyint(1)和tinyint(4) 有啥区别呢?什么是tinyint(
- 所有代码都是网上百度出来的,通过个人实践找到适合自己的。采用的python 库是 pymouse、pykeyboard安装时直接p
- 安装完 anaconda运行如下代码执行不了import numpy as npimport os,sys#获取当前文件夹,并根据文件名de
- 功能:获取android设备中某一个app的cpu和内存环境:python和adb使用方法:使用adb连接android设备,打开将要测试的
- super主要来调用父类方法来显示调用父类,在子类中,一般会定义与父类相同的属性(数据属性,方法),从而来实现子类特有的行为。也就是说,子类
- 前言其实容器类型的转换可以说是数据类型的转换,涉及到三个函数,分别是tuple()、list()、set()。为什么要做容器类型的转换,是因
- 如何修改数据库名(db_name)及实例名(Instance_name or Service_name) Nid是Oracle从9iR2开始
- 我们知道在超级链接的title属性中,是不支持html代码的,我们只能使用文本来处理提示信息。当然借助js可以做出很好的效果。这里讲一下如何
- python去除字符串最后的换行符‘\n’s = s.replace('\n',
- 在Python中,有些开源项目中的方法返回结果为self. 对于不熟悉这种用法的读者来说,这无疑使人困扰,本文的目的就是给出这种语法的一个解
- 代码如下: function HandleTabKey(evt) {
- 本文实例讲述了js鼠标滑过图片震动特效的方法。分享给大家供大家参考。具体实现方法如下:<html><head><
- 我其实是同一天看到Robert Treat几人整理的”Mysql 迁移到Oracle前需要了解的50件事“与Baron Schwartz的”