-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy patherrors.go
More file actions
236 lines (210 loc) · 5.68 KB
/
Copy patherrors.go
File metadata and controls
236 lines (210 loc) · 5.68 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package requests
import (
"errors"
"fmt"
"net/http"
"net/url"
)
// ErrorType 定义错误类型枚举
type ErrorType int
const (
// ErrorTypeNetwork 网络连接错误
ErrorTypeNetwork ErrorType = iota
// ErrorTypeTimeout 超时错误
ErrorTypeTimeout
// ErrorTypeAuth 认证错误
ErrorTypeAuth
// ErrorTypeRateLimit 限流错误
ErrorTypeRateLimit
// ErrorTypeServerError 服务器错误 (5xx)
ErrorTypeServerError
// ErrorTypeClientError 客户端错误 (4xx)
ErrorTypeClientError
// ErrorTypeValidation 参数验证错误
ErrorTypeValidation
// ErrorTypeSerialization 序列化/反序列化错误
ErrorTypeSerialization
// ErrorTypeRedirect 重定向错误
ErrorTypeRedirect
// ErrorTypeInternal 内部错误
ErrorTypeInternal
)
// String 返回错误类型的字符串表示
func (et ErrorType) String() string {
switch et {
case ErrorTypeNetwork:
return "NetworkError"
case ErrorTypeTimeout:
return "TimeoutError"
case ErrorTypeAuth:
return "AuthError"
case ErrorTypeRateLimit:
return "RateLimitError"
case ErrorTypeServerError:
return "ServerError"
case ErrorTypeClientError:
return "ClientError"
case ErrorTypeValidation:
return "ValidationError"
case ErrorTypeSerialization:
return "SerializationError"
case ErrorTypeRedirect:
return "RedirectError"
case ErrorTypeInternal:
return "InternalError"
default:
return "UnknownError"
}
}
// RequestError 统一的请求错误类型
type RequestError struct {
// Type 错误类型
Type ErrorType
// Message 错误消息
Message string
// Cause 原始错误
Cause error
// Request 失败的请求对象
Request *http.Request
// Response 响应对象(如果有的话)
Response *http.Response
// URL 请求的 URL
URL *url.URL
// StatusCode HTTP 状态码(如果有的话)
StatusCode int
}
// Error 实现 error 接口
func (e *RequestError) Error() string {
if e.Cause != nil {
return fmt.Sprintf("%s: %s (caused by: %v)", e.Type.String(), e.Message, e.Cause)
}
return fmt.Sprintf("%s: %s", e.Type.String(), e.Message)
}
// Unwrap 支持 Go 1.13+ 的错误解包
func (e *RequestError) Unwrap() error {
return e.Cause
}
// Is 支持 errors.Is 检查
func (e *RequestError) Is(target error) bool {
if target == nil {
return false
}
if t, ok := target.(*RequestError); ok {
return e.Type == t.Type
}
return false
}
// NewRequestError 创建一个新的请求错误
func NewRequestError(errorType ErrorType, message string, cause error) *RequestError {
return &RequestError{
Type: errorType,
Message: message,
Cause: cause,
}
}
// NewNetworkError 创建网络错误
func NewNetworkError(message string, cause error) *RequestError {
return NewRequestError(ErrorTypeNetwork, message, cause)
}
// NewTimeoutError 创建超时错误
func NewTimeoutError(message string, cause error) *RequestError {
return NewRequestError(ErrorTypeTimeout, message, cause)
}
// NewAuthError 创建认证错误
func NewAuthError(message string, cause error) *RequestError {
return NewRequestError(ErrorTypeAuth, message, cause)
}
// NewValidationError 创建验证错误
func NewValidationError(message string, cause error) *RequestError {
return NewRequestError(ErrorTypeValidation, message, cause)
}
// NewSerializationError 创建序列化错误
func NewSerializationError(message string, cause error) *RequestError {
return NewRequestError(ErrorTypeSerialization, message, cause)
}
// NewServerError 创建服务器错误
func NewServerError(statusCode int, message string) *RequestError {
err := NewRequestError(ErrorTypeServerError, message, nil)
err.StatusCode = statusCode
return err
}
// NewClientError 创建客户端错误
func NewClientError(statusCode int, message string) *RequestError {
err := NewRequestError(ErrorTypeClientError, message, nil)
err.StatusCode = statusCode
return err
}
// WrapWithRequest 为错误添加请求信息
func (e *RequestError) WrapWithRequest(req *http.Request) *RequestError {
e.Request = req
if req != nil {
e.URL = req.URL
}
return e
}
// WrapWithResponse 为错误添加响应信息
func (e *RequestError) WrapWithResponse(resp *http.Response) *RequestError {
e.Response = resp
if resp != nil {
e.StatusCode = resp.StatusCode
}
return e
}
// IsNetworkError 检查是否为网络错误
func IsNetworkError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeNetwork
}
return false
}
// IsTimeoutError 检查是否为超时错误
func IsTimeoutError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeTimeout
}
return false
}
// IsAuthError 检查是否为认证错误
func IsAuthError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeAuth
}
return false
}
// IsServerError 检查是否为服务器错误 (5xx)
func IsServerError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeServerError ||
(reqErr.StatusCode >= 500 && reqErr.StatusCode < 600)
}
return false
}
// IsClientError 检查是否为客户端错误 (4xx)
func IsClientError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeClientError ||
(reqErr.StatusCode >= 400 && reqErr.StatusCode < 500)
}
return false
}
// IsValidationError 检查是否为验证错误
func IsValidationError(err error) bool {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.Type == ErrorTypeValidation
}
return false
}
// GetStatusCode 从错误中提取状态码,如果没有返回 0
func GetStatusCode(err error) int {
var reqErr *RequestError
if errors.As(err, &reqErr) {
return reqErr.StatusCode
}
return 0
}