日常使用
统一错误码
import "github.com/sohaha/zlsgo/zerror"
// 建议错误码统一放置在一个文件内
const (
ErrCode500 = zerror.ErrCode(500)
ErrCode401 = zerror.ErrCode(401)
)
// 创建错误对象,包含错误码与堆栈信息
err := zerror.New(ErrCode500, "这是一个系统错误")
// 包裹错误
err2 := zerror.Wrap(err, 999, "系统繁忙")
// 判断是否含有 500 错误码
is500 := zerror.Is(err2, zerror.ErrCode(ErrCode500))
// 当前错误码
zerror.UnwrapCode(err2)
// 全部错误码
zerror.UnwrapCodes(err2)
// 解包裹信息
zerror.Unwrap(err2, ErrCode500)
// 如果 err 不带堆栈 则包裹成 zerror
err = zerror.Reuse(err)
无需错误码
// 包裹错误,无需错误码
err := zerror.With(err, "包裹错误")
// 包裹错误并补充其他信息,可以参考 WrapTag 自定义
err := zerror.With(err, "请求失败", zerror.WrapTag(zerror.NotFound))
// 获取包裹的信息
tag := zerror.GetTag(err) // NotFound
// 其他写法
err := zerror.InvalidInput.Wrap(err, "无效输入")
// 一个新的错误包裹了字符串信息 InvalidInput
// err := zerror.InvalidInput.Text("无效输入")
// 一样可以获取包裹的信息
tag := zerror.GetTag(err) // InvalidInput
自定义 TAG
var xx zerror.TagKind = "一个自定义错误"
err := xx.Text("出错了")
err.Error() == "出错了"
zerror.GetTag(err) == "一个自定义错误"
打印堆栈信息
// 方式一
zlog.Stack(err)
// 方式二
fmt.Println(err)
// 如不需要堆栈
fmt.Println("%-v", err)
示例
package main
import (
"github.com/sohaha/zlsgo/zerror"
"github.com/sohaha/zlsgo/zlog"
)
func main() {
err := newErr()
err = wrap500Err(err)
err = wrap999Err(err)
zlog.Stack(err)
}
func newErr() error {
e := func() error {
return zerror.New(400, "The is 400")
}
return e()
}
func wrap500Err(err error) error {
return zerror.Wrap(err, 500, "Wrap 500 Error")
}
func wrap999Err(err error) error {
return zerror.Wrap(err, 999, "Unknown Error")
}
异常处理
err := zerror.TryCatch(func() error {
zerror.Panic(zerror.New(500, "测试"))
return nil
})
// 如果 TryCatch 内返回了 error 或触发了 panic
if err != nil{
// ..
}