errors

package
v1.2.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 19, 2026 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package errors 定义了 scrapy-go 框架中跨包共享的错误类型。

概述

errors 包收纳了需要在多个包之间共享语义契约的错误——即某个包抛出后, 其他包需要通过 errors.Is 进行识别并据此改变行为的框架级语义错误。 对应 Scrapy Python 版本中 scrapy.exceptions 模块的功能。

职责边界

本包仅包含跨包共享的框架级错误。对于仅在单个包内使用的局部错误 (如 Runner 生命周期错误、Queue 满错误等),应遵循 Go 官方惯用法 就近定义在其所属包中(参考 io.EOF、sql.ErrNoRows 的放置方式)。

哨兵错误(Sentinel Errors)

框架定义了以下哨兵错误,使用 errors.Is 进行匹配:

组件配置:

Spider 控制:

请求处理:

Item 处理:

下载错误:

其他:

结构化错误类型

对于需要携带额外上下文信息的错误,包提供了对应的结构化类型:

所有结构化错误类型都实现了 errors.Is 接口,可以匹配对应的哨兵错误:

err := errors.NewCloseSpiderError("timeout")
errors.Is(err, errors.ErrCloseSpider) // true

错误创建

每种结构化错误都提供了对应的构造函数:

辅助函数

IsRetryable 判断错误是否可重试,以下错误类型被认为是可重试的:

  • ErrDownloadTimeout
  • ErrConnectionRefused
  • ErrDownloadFailed
  • ErrResponseDataLoss
  • ErrCannotResolveHost

与 Scrapy 的差异

  • 使用 Go 的 errors.Is/errors.As 替代 Python 的 isinstance 类型检查
  • 使用哨兵错误 + 结构化错误的双层设计(Scrapy 只有异常类)
  • NewRequestError 替代 Scrapy 中通过 Meta 键传递新请求的 hack 方式
  • PanicError 是 Go 特有的(Python 无 panic 机制)
  • StopDownloadError 的 Fail 标志决定部分响应传递给 callback 还是 errback
  • 使用 any 类型避免循环依赖(NewRequestError.Request)

使用模式

中间件中丢弃请求:

func (m *MyMiddleware) ProcessRequest(req *http.Request) error {
    if shouldIgnore(req) {
        return errors.ErrIgnoreRequest
    }
    return nil
}

Pipeline 中丢弃 Item:

func (p *MyPipeline) ProcessItem(ctx context.Context, item any) (any, error) {
    if isDuplicate(item) {
        return nil, errors.NewDropItemError("duplicate item")
    }
    return item, nil
}

信号处理器中阻止 Spider 关闭:

manager.Connect(func(params map[string]any) error {
    if hasMoreWork() {
        return errors.ErrDontCloseSpider
    }
    return nil
}, signal.SpiderIdle)

Index

Constants

This section is empty.

Variables

View Source
var ErrCannotResolveHost = errors.New("cannot resolve host")

ErrCannotResolveHost 表示无法解析主机名,对应 Scrapy 的 CannotResolveHostError。

View Source
var ErrCloseSpider = errors.New("close spider")

ErrCloseSpider 表示请求关闭 Spider,对应 Scrapy 的 CloseSpider 异常。

View Source
var ErrConnectionRefused = errors.New("connection refused")

ErrConnectionRefused 表示连接被拒绝,对应 Scrapy 的 DownloadConnectionRefusedError。

View Source
var ErrDontCloseSpider = errors.New("don't close spider")

ErrDontCloseSpider 表示请求不要关闭 Spider,对应 Scrapy 的 DontCloseSpider 异常。 在 spider_idle 信号处理器中返回此错误可阻止 Spider 关闭。

View Source
var ErrDownloadFailed = errors.New("download failed")

ErrDownloadFailed 表示下载失败,对应 Scrapy 的 DownloadFailedError。

View Source
var ErrDownloadTimeout = errors.New("download timeout")

ErrDownloadTimeout 表示下载超时,对应 Scrapy 的 DownloadTimeoutError 异常。

View Source
var ErrDropItem = errors.New("item dropped")

ErrDropItem 表示从 Item Pipeline 中丢弃一个 Item,对应 Scrapy 的 DropItem 异常。

View Source
var ErrIgnoreRequest = errors.New("request ignored")

ErrIgnoreRequest 表示决定不处理某个请求,对应 Scrapy 的 IgnoreRequest 异常。

View Source
var ErrInvalidOutput = errors.New("invalid middleware output")

ErrInvalidOutput 表示中间件返回了无效的输出类型,对应 Scrapy 的 _InvalidOutput 异常。

View Source
var ErrNewRequest = errors.New("new request")

ErrNewRequest 是一个哨兵错误,表示中间件希望用一个新请求替代当前请求。 使用 errors.Is(err, ErrNewRequest) 可以匹配 NewRequestError。

View Source
var ErrNotConfigured = errors.New("component not configured")

ErrNotConfigured 表示组件未配置,对应 Scrapy 的 NotConfigured 异常。 中间件初始化时返回此错误,框架将跳过该中间件并记录警告日志。

View Source
var ErrNotSupported = errors.New("not supported")

ErrNotSupported 表示不支持的功能或方法,对应 Scrapy 的 NotSupported 异常。

View Source
var ErrPanic = errors.New("panic recovered")

ErrPanic 表示从 panic 中恢复的错误。 当用户代码(Spider 回调、Pipeline、中间件等)发生 panic 时, 框架会捕获 panic 并将其转换为此错误,避免整个进程崩溃。

View Source
var ErrResponseDataLoss = errors.New("response data loss")

ErrResponseDataLoss 表示响应数据不完整,对应 Scrapy 的 ResponseDataLossError。

View Source
var ErrStopDownload = errors.New("stop download")

ErrStopDownload 表示停止下载响应体,对应 Scrapy 的 StopDownload 异常。

Functions

func IsRetryable

func IsRetryable(err error) bool

IsRetryable 判断错误是否可重试。 以下错误类型被认为是可重试的:

  • ErrDownloadTimeout
  • ErrConnectionRefused
  • ErrDownloadFailed
  • ErrResponseDataLoss
  • ErrCannotResolveHost

Types

type CloseSpiderError

type CloseSpiderError struct {
	Reason string
}

CloseSpiderError 是带关闭原因的 CloseSpider 错误。 使用 errors.Is(err, ErrCloseSpider) 可以匹配此错误。

func NewCloseSpiderError

func NewCloseSpiderError(reason string) *CloseSpiderError

NewCloseSpiderError 创建一个带原因的 CloseSpider 错误。

func (*CloseSpiderError) Error

func (e *CloseSpiderError) Error() string

func (*CloseSpiderError) Is

func (e *CloseSpiderError) Is(target error) bool

Is 实现 errors.Is 接口,使 CloseSpiderError 可以匹配 ErrCloseSpider。

type DropItemError

type DropItemError struct {
	Message  string
	LogLevel string // 可选的日志级别覆盖
}

DropItemError 是带消息的 DropItem 错误。 使用 errors.Is(err, ErrDropItem) 可以匹配此错误。

func NewDropItemError

func NewDropItemError(message string) *DropItemError

NewDropItemError 创建一个带消息的 DropItem 错误。

func (*DropItemError) Error

func (e *DropItemError) Error() string

func (*DropItemError) Is

func (e *DropItemError) Is(target error) bool

Is 实现 errors.Is 接口,使 DropItemError 可以匹配 ErrDropItem。

type NewRequestError

type NewRequestError struct {
	// Request 是需要重新调度的新请求。
	Request any // 实际类型为 *http.Request,使用 any 避免循环依赖
	// Reason 是产生新请求的原因(如 "retry"、"redirect")。
	Reason string
}

NewRequestError 表示中间件需要将当前请求替换为一个新请求。 典型场景包括重试(RetryMiddleware)和重定向(RedirectMiddleware)。

当中间件的 ProcessResponse 或 ProcessException 返回此错误时, Manager 会将其传播给 Engine,由 Engine 将新请求重新调度到 Scheduler。 这种方式替代了之前通过 Meta 键(如 "_retry_request"、"_redirect_request") 传递新请求的 hack 方式,更加类型安全且符合 Go 的错误处理惯例。

func NewNewRequestError

func NewNewRequestError(request any, reason string) *NewRequestError

NewNewRequestError 创建一个 NewRequestError。 request 参数的实际类型应为 *http.Request。

func (*NewRequestError) Error

func (e *NewRequestError) Error() string

func (*NewRequestError) Is

func (e *NewRequestError) Is(target error) bool

Is 实现 errors.Is 接口,使 NewRequestError 可以匹配 ErrNewRequest。

type NotConfiguredError

type NotConfiguredError struct {
	Message string
}

NotConfiguredError 是带消息的 NotConfigured 错误。

func NewNotConfiguredError

func NewNotConfiguredError(message string) *NotConfiguredError

NewNotConfiguredError 创建一个带消息的 NotConfigured 错误。

func (*NotConfiguredError) Error

func (e *NotConfiguredError) Error() string

func (*NotConfiguredError) Is

func (e *NotConfiguredError) Is(target error) bool

Is 实现 errors.Is 接口。

type PanicError

type PanicError struct {
	// Value 是 panic 传递的原始值。
	Value any
	// Stack 是 panic 发生时的堆栈信息。
	Stack string
}

PanicError 是带有 panic 值和堆栈信息的结构化错误。 使用 errors.Is(err, ErrPanic) 可以匹配此错误。

func NewPanicError

func NewPanicError(value any, stack string) *PanicError

NewPanicError 创建一个 PanicError。 value 是 recover() 返回的值,stack 是格式化的堆栈信息。

func (*PanicError) Error

func (e *PanicError) Error() string

func (*PanicError) Is

func (e *PanicError) Is(target error) bool

Is 实现 errors.Is 接口,使 PanicError 可以匹配 ErrPanic。

type StopDownloadError

type StopDownloadError struct {
	Fail bool
}

StopDownloadError 是带 fail 标志的 StopDownload 错误。 Fail 为 true 时,部分响应将传递给 errback;为 false 时传递给 callback。

func NewStopDownloadError

func NewStopDownloadError(fail bool) *StopDownloadError

NewStopDownloadError 创建一个 StopDownload 错误。

func (*StopDownloadError) Error

func (e *StopDownloadError) Error() string

func (*StopDownloadError) Is

func (e *StopDownloadError) Is(target error) bool

Is 实现 errors.Is 接口,使 StopDownloadError 可以匹配 ErrStopDownload。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL