All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m32s
86 lines
2.9 KiB
Go
86 lines
2.9 KiB
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// 中间件标准错误类型
|
|
var (
|
|
ErrMissingToken = errors.New("missing authentication token")
|
|
ErrInvalidToken = errors.New("invalid or expired token")
|
|
ErrRedisUnavailable = errors.New("redis unavailable")
|
|
ErrTooManyRequests = errors.New("too many requests")
|
|
)
|
|
|
|
// 预定义业务错误(常用错误可直接引用)
|
|
var (
|
|
ErrAssetAllocationRecordNotFound = &AppError{Code: CodeAssetAllocationRecordNotFound, Message: "分配记录不存在"}
|
|
ErrNotDirectSubordinate = &AppError{Code: CodeNotDirectSubordinate, Message: "只能操作直属下级店铺"}
|
|
ErrIotCardBoundToDevice = &AppError{Code: CodeIotCardBoundToDevice, Message: "IoT 卡已绑定设备,不能单独操作"}
|
|
ErrIotCardStatusNotAllowed = &AppError{Code: CodeIotCardStatusNotAllowed, Message: "卡状态不允许此操作"}
|
|
ErrCannotAllocateToSelf = &AppError{Code: CodeCannotAllocateToSelf, Message: "不能分配给自己"}
|
|
ErrCannotRecallFromSelf = &AppError{Code: CodeCannotRecallFromSelf, Message: "不能从自己回收"}
|
|
)
|
|
|
|
// AppError 表示带错误码的应用错误
|
|
type AppError struct {
|
|
Code int // 应用错误码
|
|
Message string // 错误消息
|
|
Err error // 底层错误(可选)
|
|
Data any // 可安全返回的结构化错误上下文(可选)
|
|
}
|
|
|
|
func (e *AppError) Error() string {
|
|
if e.Err != nil {
|
|
return fmt.Sprintf("%s: %v", e.Message, e.Err)
|
|
}
|
|
return e.Message
|
|
}
|
|
|
|
func (e *AppError) Unwrap() error {
|
|
return e.Err
|
|
}
|
|
|
|
// New 创建新的 AppError
|
|
// 优先使用 errorMessages 映射表中的消息,允许通过可选参数覆盖
|
|
// 用法:
|
|
// - errors.New(errors.CodeNotFound) // 使用映射表默认消息
|
|
// - errors.New(errors.CodeNotFound, "提现申请不存在") // 覆盖为自定义消息
|
|
func New(code int, customMsg ...string) *AppError {
|
|
// 默认从映射表获取消息
|
|
message := GetMessage(code, "zh-CN")
|
|
// 如果提供了自定义消息且非空,则覆盖
|
|
if len(customMsg) > 0 && customMsg[0] != "" {
|
|
message = customMsg[0]
|
|
}
|
|
return &AppError{
|
|
Code: code,
|
|
Message: message,
|
|
}
|
|
}
|
|
|
|
// NewWithData 创建携带安全结构化上下文的 AppError。
|
|
func NewWithData(code int, data any, customMsg ...string) *AppError {
|
|
err := New(code, customMsg...)
|
|
err.Data = data
|
|
return err
|
|
}
|
|
|
|
// Wrap 用错误码和消息包装现有错误
|
|
// 优先使用 errorMessages 映射表中的消息,允许通过可选参数覆盖
|
|
// 用法:
|
|
// - errors.Wrap(errors.CodeDatabaseError, originalErr) // 使用映射表默认消息
|
|
// - errors.Wrap(errors.CodeDatabaseError, originalErr, "查询用户失败") // 覆盖为自定义消息
|
|
func Wrap(code int, err error, customMsg ...string) *AppError {
|
|
message := GetMessage(code, "zh-CN")
|
|
if len(customMsg) > 0 && customMsg[0] != "" {
|
|
message = customMsg[0]
|
|
}
|
|
return &AppError{
|
|
Code: code,
|
|
Message: message,
|
|
Err: err,
|
|
}
|
|
}
|