Golang自定义error

Golang
Go语言的一大特点就是简洁高效,最近开始有越来越多的团队和开发人员开始尝试使用golang进行开发。Golang自带了很多原生的包,可以满足基础的开发需要,但是就如语言本身一样,自带的各种package也跟golang一样追求高效简洁,有时候甚至有些简陋。
errors就是一个“简陋”的原生package,原生的errors只支持一个方法

1
errors.New("text")

显然这并不能完全满足我们的需求。
但是errors被定义成了一个接口,而golang巧妙的设计使其可以通过实现接口所包含的方法的基础上额外扩展更多的方法,于是我就研究了一下弄了这么一个东西出来,这个包主要有一下几个特点:

  • 支持打印错误堆栈信息,可以方便跟踪到具体是哪一行代码出错。
  • 支持字符串格式化
  • 支持json返回

实现的方法很简单,利用runtime包获取运行时信息,利用json包进行错误数据json输出,利用fmt包进行格式化。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
Author: Ansiz
Email: z332191120@hotmail.com
General Usage:
New error with a customized error code:
errors.New(999,"some error in program")
errors.Newf(600,"redis connect error:%v", err)
Catch error just like common error
err := webserver.SomeApi()
if err!=nil{
//do something
}
Webserver Usage:
import "your_go_src/errors"

err:= webserver.SomeApi()
if e,ok := err.(*error.Error);ok{
json := e.JsonError()
fmt.Println(json) // a json string will be printed with Code,Msg & StackTrace
}

*/

package errors

import (
"encoding/json"
"fmt"
"path"
"runtime"
)

type Error struct {
Code int
Msg string
StackTrace string
}

// Error with stack info
func New(code int, msg string) error {
return &Error{code, msg, stack(3)}
}

func Newf(code int, format string, args ...interface{}) error {
return &Error{code, fmt.Sprintf(format, args), stack(3)}
}

func (e *Error) Error() string {
return e.Msg + e.StackTrace
}

func (e *Error) JsonError() string {
err, _ := json.Marshal(e)
return string(err)
}

func stack(skip int) string {
stk := make([]uintptr, 32)
str := ""
l := runtime.Callers(skip, stk[:])
for i := 0; i < l; i++ {
f := runtime.FuncForPC(stk[i])
name := f.Name()
file, line := f.FileLine(stk[i])
str += fmt.Sprintf("\n %-30s [%s:%d]", name, path.Base(file), line)
}
return str
}

怎么样,是不是变得强大了很多?科科~

坚持原创技术分享,您的支持将鼓励我继续创作!