Skip to content

Commit f2055fb

Browse files
committed
fix: 完善文档
1 parent 243291c commit f2055fb

File tree

6 files changed

+44
-86
lines changed

6 files changed

+44
-86
lines changed

README.md

Lines changed: 29 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# xerror
22

3-
go error 简单实现
3+
> go error 简单实现
4+
5+
1. 高效处理golang的error, 避免处理大量的 `err!=nil` 判断
6+
2. 高效处理golang的recover, 让错误中包含丰富的堆栈信息
7+
3. xerror实现标准As,Is,Unwrap接口, 可以和其他error库一起使用
8+
4. 简单易用
49

510

611
## 性能分析
@@ -22,105 +27,51 @@ ok github.com/pubgo/xerror 4.363s
2227
```
2328

2429
## example
25-
```go
26-
package xerror_http
27-
28-
import (
29-
"github.com/pubgo/xerror"
30-
"net/http"
31-
)
32-
33-
var (
34-
ErrHttp = xerror.New("http error", "http错误")
35-
ErrBadRequest = ErrHttp.New("400", http.StatusText(400))
36-
ErrUnauthorized = ErrHttp.New("401", http.StatusText(401))
37-
ErrForbidden = ErrHttp.New("403", http.StatusText(403))
38-
ErrNotFound = ErrHttp.New("404", http.StatusText(404))
39-
ErrMethodNotAllowed = ErrHttp.New("405", http.StatusText(405))
40-
ErrTimeout = ErrHttp.New("408", http.StatusText(408))
41-
ErrConflict = ErrHttp.New("409", http.StatusText(409))
42-
ErrInternalServerError = ErrHttp.New("500", http.StatusText(500))
43-
)
44-
```
45-
4630
```go
4731
package xerror_test
4832

4933
import (
5034
"fmt"
51-
"log"
5235
"testing"
5336

5437
"github.com/pubgo/xerror"
55-
"github.com/pubgo/xerror/xerror_core"
56-
"github.com/pubgo/xerror/xerror_http"
5738
)
5839

59-
func check(b bool) {
60-
if !b {
61-
log.Fatalln("")
62-
}
63-
}
64-
65-
func panic1(a ...interface{}) (err error) {
66-
defer xerror.RespErr(&err)
67-
xerror.PanicF(xerror_http.ErrBadRequest, "panic1 %+v", a)
68-
return
69-
}
70-
71-
func panic2(a ...interface{}) (err error) {
72-
defer xerror.RespErr(&err)
73-
xerror.PanicF(panic1(a...), "panic2 %+v", a)
74-
return
75-
}
76-
77-
func panicWrap(a ...interface{}) (err error) {
78-
return xerror.WrapF(panic2(a...), "panicWrap %+v", a)
40+
func TestErr(t *testing.T) {
41+
fmt.Println(xerror.Wrap(xerror.ErrAssert))
7942
}
8043

81-
func TestStack(t *testing.T) {
82-
defer xerror.Resp(func(err xerror.XErr) {
83-
fmt.Println(err.Stack(true))
44+
func TestParseWith(t *testing.T) {
45+
var err = fmt.Errorf("hello error")
46+
xerror.ParseWith(err, func(err xerror.XErr) {
47+
fmt.Printf("%v\n", err)
8448
})
85-
xerror.Panic(panicWrap(1, 2, 4, 5))
8649
}
8750

88-
func TestAs(t *testing.T) {
89-
check(xerror.FamilyAs(panicWrap(1, 2, 4, 5), xerror_http.ErrHttp) == true)
90-
check(xerror.FamilyAs(panicWrap(1, 2, 4, 5), xerror_http.ErrBadRequest) == true)
91-
check(xerror.FamilyAs(panicWrap(1, 2, 4, 5), xerror_http.ErrNotFound) == false)
51+
func TestRespTest(t *testing.T) {
52+
defer xerror.RespTest(t)
53+
TestPanic1(t)
9254
}
9355

94-
func TestExit(t *testing.T) {
95-
xerror_core.PrintStack = false
96-
xerror.Exit(panicWrap(1, 2, 4, 5))
56+
func TestRespNext(t *testing.T) {
57+
defer xerror.RespExit("TestRespNext")
58+
TestPanic1(t)
9759
}
9860

99-
func TestTry(t *testing.T) {
100-
fmt.Println(xerror.Try(func() {
101-
panic("hello")
102-
}))
103-
}
61+
func TestPanic1(t *testing.T) {
62+
//defer xerror.RespExit()
63+
defer xerror.RespRaise(func(err xerror.XErr) error {
64+
return xerror.WrapF(err, "test raise")
65+
})
10466

105-
func BenchmarkPanic(b *testing.B) {
106-
for i := 0; i < b.N; i++ {
107-
_ = func() (err error) {
108-
defer xerror.RespErr(&err)
109-
xerror.Panic(xerror_http.ErrBadRequest)
110-
return
111-
}()
112-
}
67+
//xerror.Panic(xerror.New("ok"))
68+
xerror.Panic(fmt.Errorf("ss"))
11369
}
11470

115-
func BenchmarkPanicWithoutCaller(b *testing.B) {
116-
xerror_core.IsCaller = false
117-
for i := 0; i < b.N; i++ {
118-
_ = func() (err error) {
119-
defer xerror.RespErr(&err)
120-
xerror.Panic(xerror_http.ErrBadRequest)
121-
return
122-
}()
123-
}
71+
func init1Next() (err error) {
72+
defer xerror.RespErr(&err)
73+
xerror.Panic(fmt.Errorf("test next"))
74+
return nil
12475
}
12576

12677
func BenchmarkNoPanic(b *testing.B) {

example/main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99

1010
func main() {
1111
xerror.Exit(http.ListenAndServe(":8088", http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
12-
defer xerror.RespHttp(writer, request)
12+
defer xerror.RespHttp(writer, request, func(err error) {
13+
fmt.Println(err)
14+
})
1315
xerror.Panic(fmt.Errorf("panic"))
1416
})))
1517
}

internal/utils/util.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func CallerWithDepth(cd int) string {
2525
return "unknown type"
2626
}
2727

28+
2829
file, line := fn.FileLine(f.pc())
2930
return file + ":" + strconv.Itoa(line)
3031
}

xerror.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ func (t *xerror) Is(err error) bool {
6666
return false
6767
}
6868

69-
switch err := err.(type) {
69+
switch _err := err.(type) {
7070
case *xerrorBase:
71-
return err == t.Err
71+
return _err == t.Err
7272
case *xerror:
73-
return err == t || err.Err == t.Err
73+
return _err == t || _err.Err == t.Err
7474
case error:
75-
return t.Err == err
75+
return t.Err == _err
7676
default:
7777
return false
7878
}

xerror_goleak/goleak.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package xerror_goleak
22

33
import (
4-
"go.uber.org/goleak"
5-
64
"testing"
5+
6+
"go.uber.org/goleak"
77
)
88

99
type Option = goleak.Option

xerror_resp.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func RespTest(t *testing.T, debugs ...bool) {
133133
t.Fatal(msg)
134134
}
135135

136-
func RespHttp(w http.ResponseWriter, req *http.Request) {
136+
func RespHttp(w http.ResponseWriter, req *http.Request, fns ...func(err error)) {
137137
val := recover()
138138
if val == nil {
139139
return
@@ -156,5 +156,9 @@ func RespHttp(w http.ResponseWriter, req *http.Request) {
156156
fmt.Fprint(w, "\n\n\n\n")
157157
fmt.Fprintln(w, "stack")
158158
buf := make([]byte, 1024*1024)
159+
if len(fns) > 0 {
160+
fns[0](err)
161+
}
162+
159163
fmt.Fprintln(w, string(buf[:runtime.Stack(buf, true)]))
160164
}

0 commit comments

Comments
 (0)