日常使用

统一错误码

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")
}

Untitled

异常处理

err := zerror.TryCatch(func() error {
	zerror.Panic(zerror.New(500, "测试"))
	
	return nil
})

// 如果 TryCatch 内返回了 error 或触发了 panic
if err != nil{
	// ..
}