## 一. 前言
### 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>
交流学习
有疑问加站长微信联系(非本文作者))