☠️

错误处理

日常使用

统一错误码

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

异常处理

err := zerror.TryCatch(func() error { zerror.Panic(zerror.New(500, "测试")) return nil }) // 如果 TryCatch 内返回了 error 或触发了 panic if err != nil{ // .. }