Files
seqlog/errors.go

174 lines
4.4 KiB
Go
Raw Normal View History

package seqlog
import (
"errors"
"fmt"
)
// 哨兵错误Sentinel Errors- 可以使用 errors.Is 进行判断
var (
// ErrNilParameter 表示必需的参数为 nil
ErrNilParameter = errors.New("required parameter is nil")
// ErrInvalidCount 表示 count 参数必须大于 0
ErrInvalidCount = errors.New("count must be greater than 0")
// ErrInvalidRange 表示索引或范围参数无效
ErrInvalidRange = errors.New("invalid index or range")
// ErrAlreadyRunning 表示组件已经在运行
ErrAlreadyRunning = errors.New("already running")
// ErrNotRunning 表示组件未运行
ErrNotRunning = errors.New("not running")
// ErrAlreadyRegistered 表示资源已经注册
ErrAlreadyRegistered = errors.New("already registered")
// ErrNotFound 表示资源未找到
ErrNotFound = errors.New("not found")
// ErrCRCMismatch 表示 CRC 校验失败
ErrCRCMismatch = errors.New("crc mismatch")
// ErrInvalidUUID 表示 UUID 格式无效
ErrInvalidUUID = errors.New("invalid uuid")
// ErrInvalidConfig 表示配置无效
ErrInvalidConfig = errors.New("invalid config")
// ErrProcessorResetting 表示处理器正在重置中,操作被阻止
ErrProcessorResetting = errors.New("processor is resetting, operations blocked")
// ErrInvalidState 表示处理器状态无效,不允许执行该操作
ErrInvalidState = errors.New("invalid processor state for this operation")
)
// TopicError 表示与 topic 相关的错误
type TopicError struct {
Topic string // topic 名称
Op string // 操作名称(如 "write", "query", "start"
Err error // 底层错误
}
func (e *TopicError) Error() string {
if e.Err != nil {
return fmt.Sprintf("topic %s: %s: %v", e.Topic, e.Op, e.Err)
}
return fmt.Sprintf("topic %s: %s", e.Topic, e.Op)
}
func (e *TopicError) Unwrap() error {
return e.Err
}
// NewTopicError 创建一个 topic 相关的错误
func NewTopicError(topic, op string, err error) *TopicError {
return &TopicError{
Topic: topic,
Op: op,
Err: err,
}
}
// FileError 表示文件操作相关的错误
type FileError struct {
Path string // 文件路径
Op string // 操作名称(如 "open", "read", "write"
Err error // 底层错误
}
func (e *FileError) Error() string {
if e.Err != nil {
return fmt.Sprintf("file %s: %s: %v", e.Path, e.Op, e.Err)
}
return fmt.Sprintf("file %s: %s", e.Path, e.Op)
}
func (e *FileError) Unwrap() error {
return e.Err
}
// NewFileError 创建一个文件操作相关的错误
func NewFileError(path, op string, err error) *FileError {
return &FileError{
Path: path,
Op: op,
Err: err,
}
}
// IndexError 表示索引相关的错误
type IndexError struct {
Index int // 请求的索引
Max int // 最大有效索引
Err error // 底层错误(通常是 ErrInvalidRange
}
func (e *IndexError) Error() string {
if e.Err != nil {
return fmt.Sprintf("index %d out of range [0, %d): %v", e.Index, e.Max, e.Err)
}
return fmt.Sprintf("index %d out of range [0, %d)", e.Index, e.Max)
}
func (e *IndexError) Unwrap() error {
return e.Err
}
// NewIndexError 创建一个索引越界错误
func NewIndexError(index, max int) *IndexError {
return &IndexError{
Index: index,
Max: max,
Err: ErrInvalidRange,
}
}
// ValidationError 表示参数验证错误
type ValidationError struct {
Field string // 字段名称
Message string // 错误消息
Err error // 底层错误
}
func (e *ValidationError) Error() string {
if e.Err != nil {
return fmt.Sprintf("validation error: %s: %s: %v", e.Field, e.Message, e.Err)
}
return fmt.Sprintf("validation error: %s: %s", e.Field, e.Message)
}
func (e *ValidationError) Unwrap() error {
return e.Err
}
// NewValidationError 创建一个参数验证错误
func NewValidationError(field, message string, err error) *ValidationError {
return &ValidationError{
Field: field,
Message: message,
Err: err,
}
}
// IsTopicNotFound 检查错误是否为 topic 不存在
func IsTopicNotFound(err error) bool {
var topicErr *TopicError
if errors.As(err, &topicErr) {
return errors.Is(topicErr.Err, ErrNotFound)
}
return errors.Is(err, ErrNotFound)
}
// IsIndexOutOfRange 检查错误是否为索引越界
func IsIndexOutOfRange(err error) bool {
var indexErr *IndexError
return errors.As(err, &indexErr)
}
// IsCRCMismatch 检查错误是否为 CRC 校验失败
func IsCRCMismatch(err error) bool {
return errors.Is(err, ErrCRCMismatch)
}