Skip to content

Commit b4077d9

Browse files
committed
完善常用错误快捷方式
1 parent e7073fe commit b4077d9

6 files changed

Lines changed: 169 additions & 31 deletions

File tree

HISTORY.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## ✒ 历史版本的特性介绍 (Features in old versions)
22

3+
### v0.6.2-alpha
4+
5+
> 此版本发布于 2024-08-10
6+
7+
* 完善常用错误快捷方式
8+
39
### v0.6.1-alpha
410

511
> 此版本发布于 2024-08-10

README.en.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,40 @@ import (
2727

2828
func main() {
2929
// Use wrap function to create an *Error error which has code and message.
30+
// You can get code and message of err anytime.
3031
err := errors.Wrap(1000, "need login")
3132
fmt.Println(err)
32-
33-
// You can get code and message of err anytime.
3433
fmt.Println(err.Code(), err.Message())
3534

3635
// Try these ways to get code and message!
3736
// You will get default code or message if err doesn't have a code or message.
38-
fmt.Println(errors.Code(err, 6699), errors.Message(err, "default message"))
39-
fmt.Println(errors.Code(io.EOF, 6699), errors.Message(io.EOF, "default message"))
37+
code := errors.Code(err, 6699)
38+
message := errors.Message(err, "default message")
39+
fmt.Println(code, message)
40+
41+
code = errors.Code(io.EOF, 6699)
42+
message = errors.Message(io.EOF, "default message")
43+
fmt.Println(code, message)
4044

4145
// Also, we provide some useful information carrier for you.
46+
// For examples, you can carry an error or caller information.
4247
err = errors.Wrap(9999, "io timeout").With(io.EOF).WithCaller()
4348
fmt.Println(err)
49+
fmt.Println(errors.CodeMessage(err, 6666, "default message"))
4450

4551
// What's more, we provide some shortcuts for you.
46-
// All these ways are returning a *Error and you are free to use all methods on *Error.
52+
// All these ways are returning *Error and you are free to use all methods on *Error.
4753
berr := errors.BadRequest("id is wrong")
4854
ferr := errors.Forbidden("user isn't allowed")
4955
nerr := errors.NotFound("book not found")
5056
rerr := errors.RequireLogin("user requires login")
5157
fmt.Printf("%+v\n%+v\n%+v\n%+v\n", berr, ferr, nerr, rerr)
58+
59+
isBadRequest := errors.MatchBadRequest(berr)
60+
isForbidden := errors.MatchForbidden(ferr)
61+
isNotFound := errors.MatchNotFound(nerr)
62+
isRequireLogin := errors.MatchRequireLogin(rerr)
63+
fmt.Printf("isBadRequest: %+v\nisForbidden: %+v\nisNotFound: %+v\nisRequireLogin: %+v\n", isBadRequest, isForbidden, isNotFound, isRequireLogin)
5264
}
5365

5466
```

README.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,40 @@ import (
2727

2828
func main() {
2929
// Use wrap function to create an *Error error which has code and message.
30+
// You can get code and message of err anytime.
3031
err := errors.Wrap(1000, "need login")
3132
fmt.Println(err)
32-
33-
// You can get code and message of err anytime.
3433
fmt.Println(err.Code(), err.Message())
3534

3635
// Try these ways to get code and message!
3736
// You will get default code or message if err doesn't have a code or message.
38-
fmt.Println(errors.Code(err, 6699), errors.Message(err, "default message"))
39-
fmt.Println(errors.Code(io.EOF, 6699), errors.Message(io.EOF, "default message"))
37+
code := errors.Code(err, 6699)
38+
message := errors.Message(err, "default message")
39+
fmt.Println(code, message)
40+
41+
code = errors.Code(io.EOF, 6699)
42+
message = errors.Message(io.EOF, "default message")
43+
fmt.Println(code, message)
4044

4145
// Also, we provide some useful information carrier for you.
46+
// For examples, you can carry an error or caller information.
4247
err = errors.Wrap(9999, "io timeout").With(io.EOF).WithCaller()
4348
fmt.Println(err)
49+
fmt.Println(errors.CodeMessage(err, 6666, "default message"))
4450

4551
// What's more, we provide some shortcuts for you.
46-
// All these ways are returning a *Error and you are free to use all methods on *Error.
52+
// All these ways are returning *Error and you are free to use all methods on *Error.
4753
berr := errors.BadRequest("id is wrong")
4854
ferr := errors.Forbidden("user isn't allowed")
4955
nerr := errors.NotFound("book not found")
5056
rerr := errors.RequireLogin("user requires login")
5157
fmt.Printf("%+v\n%+v\n%+v\n%+v\n", berr, ferr, nerr, rerr)
58+
59+
isBadRequest := errors.MatchBadRequest(berr)
60+
isForbidden := errors.MatchForbidden(ferr)
61+
isNotFound := errors.MatchNotFound(nerr)
62+
isRequireLogin := errors.MatchRequireLogin(rerr)
63+
fmt.Printf("isBadRequest: %+v\nisForbidden: %+v\nisNotFound: %+v\nisRequireLogin: %+v\n", isBadRequest, isForbidden, isNotFound, isRequireLogin)
5264
}
5365

5466
```

_examples/basic.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,38 @@ import (
1313

1414
func main() {
1515
// Use wrap function to create an *Error error which has code and message.
16+
// You can get code and message of err anytime.
1617
err := errors.Wrap(1000, "need login")
1718
fmt.Println(err)
18-
19-
// You can get code and message of err anytime.
2019
fmt.Println(err.Code(), err.Message())
2120

2221
// Try these ways to get code and message!
2322
// You will get default code or message if err doesn't have a code or message.
24-
fmt.Println(errors.Code(err, 6699), errors.Message(err, "default message"))
25-
fmt.Println(errors.Code(io.EOF, 6699), errors.Message(io.EOF, "default message"))
23+
code := errors.Code(err, 6699)
24+
message := errors.Message(err, "default message")
25+
fmt.Println(code, message)
26+
27+
code = errors.Code(io.EOF, 6699)
28+
message = errors.Message(io.EOF, "default message")
29+
fmt.Println(code, message)
2630

2731
// Also, we provide some useful information carrier for you.
32+
// For examples, you can carry an error or caller information.
2833
err = errors.Wrap(9999, "io timeout").With(io.EOF).WithCaller()
2934
fmt.Println(err)
35+
fmt.Println(errors.CodeMessage(err, 6666, "default message"))
3036

3137
// What's more, we provide some shortcuts for you.
32-
// All these ways are returning a *Error and you are free to use all methods on *Error.
38+
// All these ways are returning *Error and you are free to use all methods on *Error.
3339
berr := errors.BadRequest("id is wrong")
3440
ferr := errors.Forbidden("user isn't allowed")
3541
nerr := errors.NotFound("book not found")
3642
rerr := errors.RequireLogin("user requires login")
3743
fmt.Printf("%+v\n%+v\n%+v\n%+v\n", berr, ferr, nerr, rerr)
44+
45+
isBadRequest := errors.MatchBadRequest(berr)
46+
isForbidden := errors.MatchForbidden(ferr)
47+
isNotFound := errors.MatchNotFound(nerr)
48+
isRequireLogin := errors.MatchRequireLogin(rerr)
49+
fmt.Printf("isBadRequest: %+v\nisForbidden: %+v\nisNotFound: %+v\nisRequireLogin: %+v\n", isBadRequest, isForbidden, isNotFound, isRequireLogin)
3850
}

types.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,48 @@
55
package errors
66

77
const (
8-
CodeBadRequest = 400
9-
CodeForbidden = 403
10-
CodeNotFound = 404
11-
CodeRequireLogin = 1000
8+
codeBadRequest = 400
9+
codeForbidden = 403
10+
codeNotFound = 404
11+
codeRequireLogin = 1000
1212
)
1313

14+
// BadRequest returns *Error with bad request code.
1415
func BadRequest(message string) *Error {
15-
return Wrap(CodeBadRequest, message)
16+
return Wrap(codeBadRequest, message)
1617
}
1718

19+
// Forbidden returns *Error with forbidden code.
1820
func Forbidden(message string) *Error {
19-
return Wrap(CodeForbidden, message)
21+
return Wrap(codeForbidden, message)
2022
}
2123

24+
// NotFound returns *Error with not found code.
2225
func NotFound(message string) *Error {
23-
return Wrap(CodeNotFound, message)
26+
return Wrap(codeNotFound, message)
2427
}
2528

29+
// RequireLogin returns *Error with require login code.
2630
func RequireLogin(message string) *Error {
27-
return Wrap(CodeRequireLogin, message)
31+
return Wrap(codeRequireLogin, message)
32+
}
33+
34+
// MatchBadRequest matches err with bad request code.
35+
func MatchBadRequest(err error) bool {
36+
return Match(err, codeBadRequest)
37+
}
38+
39+
// MatchForbidden matches err with forbidden code.
40+
func MatchForbidden(err error) bool {
41+
return Match(err, codeForbidden)
42+
}
43+
44+
// MatchNotFound matches err with not found code.
45+
func MatchNotFound(err error) bool {
46+
return Match(err, codeNotFound)
47+
}
48+
49+
// MatchRequireLogin matches err with require login code.
50+
func MatchRequireLogin(err error) bool {
51+
return Match(err, codeRequireLogin)
2852
}

types_test.go

Lines changed: 80 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ func TestBadRequest(t *testing.T) {
1313
code int32
1414
}{
1515
{
16-
message: "id is nil",
17-
code: CodeBadRequest,
16+
message: "xxx",
17+
code: codeBadRequest,
1818
},
1919
}
2020

@@ -33,8 +33,8 @@ func TestForbidden(t *testing.T) {
3333
code int32
3434
}{
3535
{
36-
message: "id is nil",
37-
code: CodeForbidden,
36+
message: "xxx",
37+
code: codeForbidden,
3838
},
3939
}
4040

@@ -53,8 +53,8 @@ func TestNotFound(t *testing.T) {
5353
code int32
5454
}{
5555
{
56-
message: "id is nil",
57-
code: CodeNotFound,
56+
message: "xxx",
57+
code: codeNotFound,
5858
},
5959
}
6060

@@ -73,8 +73,8 @@ func TestRequireLogin(t *testing.T) {
7373
code int32
7474
}{
7575
{
76-
message: "id is nil",
77-
code: CodeRequireLogin,
76+
message: "xxx",
77+
code: codeRequireLogin,
7878
},
7979
}
8080

@@ -85,3 +85,75 @@ func TestRequireLogin(t *testing.T) {
8585
}
8686
}
8787
}
88+
89+
// go test -v -cover -count=1 -test.cpu=1 -run=^TestMatchBadRequest$
90+
func TestMatchBadRequest(t *testing.T) {
91+
testCases := []struct {
92+
message string
93+
}{
94+
{
95+
message: "xxx",
96+
},
97+
}
98+
99+
for _, testCase := range testCases {
100+
err := BadRequest(testCase.message)
101+
if !MatchBadRequest(err) {
102+
t.Errorf("err %+v not match code %d", err, err.Code())
103+
}
104+
}
105+
}
106+
107+
// go test -v -cover -count=1 -test.cpu=1 -run=^TestMatchForbidden$
108+
func TestMatchForbidden(t *testing.T) {
109+
testCases := []struct {
110+
message string
111+
}{
112+
{
113+
message: "xxx",
114+
},
115+
}
116+
117+
for _, testCase := range testCases {
118+
err := Forbidden(testCase.message)
119+
if !MatchForbidden(err) {
120+
t.Errorf("err %+v not match code %d", err, err.Code())
121+
}
122+
}
123+
}
124+
125+
// go test -v -cover -count=1 -test.cpu=1 -run=^TestMatchNotFound$
126+
func TestMatchNotFound(t *testing.T) {
127+
testCases := []struct {
128+
message string
129+
}{
130+
{
131+
message: "xxx",
132+
},
133+
}
134+
135+
for _, testCase := range testCases {
136+
err := NotFound(testCase.message)
137+
if !MatchNotFound(err) {
138+
t.Errorf("err %+v not match code %d", err, err.Code())
139+
}
140+
}
141+
}
142+
143+
// go test -v -cover -count=1 -test.cpu=1 -run=^TestMatchRequireLogin$
144+
func TestMatchRequireLogin(t *testing.T) {
145+
testCases := []struct {
146+
message string
147+
}{
148+
{
149+
message: "xxx",
150+
},
151+
}
152+
153+
for _, testCase := range testCases {
154+
err := RequireLogin(testCase.message)
155+
if !MatchRequireLogin(err) {
156+
t.Errorf("err %+v not match code %d", err, err.Code())
157+
}
158+
}
159+
}

0 commit comments

Comments
 (0)