golang自定义一个简洁而强大的错误追踪包

fizzday · · 714 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## 一. 前言 ### 1.1 错误追踪需要了解的信息 - 错误提示语 - 错误的位置, 如:具体的文件名,错误行号和错误方法等. ### 1.2 实际情况 - golang自带了错误信息包`error` 只提供了简单的用法, 如`errors.New()`,和`errors.Error()`用来传递和获取错误信息. - 明显官方的包已经不能满足了, 只能采取其他方法补救, 如: - 扩充官方包 - 自定义错误包 - 目前已经有很多人造了这个轮子, 同时也各有特色, 有简单的, 也有复杂的. - 这里为了简单使用, 我便选择了扩充官方包, 做一个简单优雅的错误处理包. ## 1.3 实现目标 通过简单调用, 即可以查看我们需要的信息, 最好是一键调用搞定. 为了照顾使用习惯, 我们就采用跟官方一致的用法, 来完成. 该包已经完成, github地址为 https://github.com/gohouse/e ## 二. 实战 ### 2.1 先看下简单用法 - 生成一个错误 ``` err := e.New("这里有错误") ``` > 跟官方的方法名保持一致, 只不过放在了自己的`package e`包下边 - 查看错误信息 ``` err.Error() ``` > 这个跟官方保持一致, 返回的也仅仅是string - 查看堆栈信息 ```go err.Stack() ``` 这里的stack是一个结构体, 包含了错误的文件名,行号和具体方法名 ```go type ErrorStack struct { File string Line int FuncName string } ``` 因此, 我们要拿到对应的信息, 就只需要简单调用即可 ```go // 获取堆栈对象 errorStack := err.Stack() // 获取错误的文件 errorStack.File // 获取错误的文件行号 errorStack.Line // 获取错误的方法名 errorStack.FuncName ``` ### 2.2 返回官方的标准`error` ``` err.ToError() ``` 这里则把错误信息交还给官方标准`error`, 只包含标准的错误信息 如果想携带stack信息, 则可以使用 ``` err.ToErrorWithStack() ``` 返回格式为 ``` error.New("标准错误信息; 错误文件:错误行号:错误方法名") ``` ## 三. 完整示例 ```go package main import ( "fmt" "github.com/gohouse/e" ) func main() { var err e.E // 或者 var err e.Error err = testError() fmt.Println("错误信息:", err.Error()) fmt.Println("错误堆栈信息:", err.Stack()) fmt.Println("错误的文件名为:", err.Stack().File) fmt.Println("错误行号:", err.Stack().Line) fmt.Println("错误方法名:", err.Stack().FuncName) fmt.Printf("%#v", err) } func testError() e.Error { return e.New("only show a custom errors demo") } ``` 输出结果 ```bash 错误信息: only show a custom errors demo 错误堆栈信息: {23 main.testError /go/src/github.com/gohouse/demo/e.go} 错误的文件名为: /go/src/github.com/gohouse/demo/e.go 错误行号: 23 错误方法名: main.testError e.Error{Msg:"only show a custom errors demo", Stack:e.Stack{Line:23, FuncName:"main.main", File:"/go/src/github.com/demo/e.go"}} ``` ## 四. 更多用法 请查看官方仓库, 地址为: https://github.com/gohouse/e 或者加入QQ群: 470809220 <a target="_blank" href="https://jq.qq.com/?_wv=1027&k=5JJOG9E"> <img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="gorose-orm" title="gorose-orm"></a> 交流学习

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

714 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传