Skip to content

错误类型

ClientError

go
type ClientError = engine.ClientError

分类的 HTTP 客户端错误,通过 errors.As 提取。

结构体字段

go
type ClientError struct {
    Type       ErrorType  // 错误分类
    Message    string     // 错误描述
    Cause      error      // 底层错误
    URL        string     // 请求 URL(脱敏)
    Method     string     // HTTP 方法
    Attempts   int        // 已尝试次数
    StatusCode int        // HTTP 状态码(如适用)
    Host       string     // 主机名(用于断路器)
}
字段类型说明
TypeErrorType错误分类,用于 switch 判断
Messagestring错误描述信息
Causeerror底层错误,可通过 Unwrap() 获取
URLstring请求 URL(凭据已脱敏)
MethodstringHTTP 方法(GET、POST 等)
Attemptsint已尝试次数(含首次请求)
StatusCodeintHTTP 状态码(非 HTTP 错误时为 0)
Hoststring请求主机名

方法

方法返回值说明
Error()string格式化为 METHOD URL: Message: Cause (attempt N)
Code()string可读错误码,如 "NETWORK_ERROR""TIMEOUT"
IsRetryable()bool是否可重试
Unwrap()error解包底层错误
WithType(t ErrorType)*ClientError返回设置错误类型的副本(不修改原始)
go
var clientErr *httpc.ClientError
if errors.As(err, &clientErr) {
    fmt.Println("错误类型:", clientErr.Code())
    fmt.Println("请求 URL:", clientErr.URL)
    fmt.Println("重试次数:", clientErr.Attempts)
    fmt.Println("可重试:", clientErr.IsRetryable())
    fmt.Println("底层错误:", clientErr.Unwrap())
}

ErrorType

go
type ErrorType = engine.ErrorType

错误分类枚举。

常量说明可重试
ErrorTypeUnknown未知/未分类错误
ErrorTypeNetwork网络错误(连接拒绝、连接重置等)视情况
ErrorTypeTimeout请求超时视情况¹
ErrorTypeContextCanceled上下文取消
ErrorTypeResponseRead响应体读取错误视情况
ErrorTypeTransport传输层错误
ErrorTypeRetryExhausted重试耗尽
ErrorTypeTLSTLS 错误
ErrorTypeCertificate证书验证错误
ErrorTypeDNSDNS 解析错误视情况
ErrorTypeValidation请求验证错误
ErrorTypeHTTPHTTP 层错误视情况

¹ 由上下文截止(WithTimeoutTimeoutConfig.Request)触发的超时不会重试;仅传输层超时(如 net.OpError 超时)才会重试。

类型判断

go
result, err := client.Get(url)
if err != nil {
    var clientErr *httpc.ClientError
    if errors.As(err, &clientErr) {
        switch clientErr.Type {
        case httpc.ErrorTypeTimeout:
            log.Println("请求超时")
        case httpc.ErrorTypeNetwork:
            log.Println("网络错误")
        case httpc.ErrorTypeTLS:
            log.Println("TLS 错误")
        case httpc.ErrorTypeCertificate:
            log.Println("证书验证失败")
        case httpc.ErrorTypeDNS:
            log.Println("DNS 解析失败")
        case httpc.ErrorTypeRetryExhausted:
            log.Println("重试耗尽")
        case httpc.ErrorTypeContextCanceled:
            log.Println("请求已取消")
        case httpc.ErrorTypeValidation:
            log.Println("请求验证失败")
        }
    }
}

错误变量

配置错误

变量说明
ErrNilConfig配置为 nil
ErrInvalidTimeout超时值无效
ErrInvalidRetry重试配置无效
ErrInvalidConnection连接配置无效
ErrInvalidSecurity安全配置无效
ErrInvalidMiddleware中间件配置无效

请求错误

变量说明
ErrInvalidHeader请求头验证失败

响应错误

变量说明
ErrResponseBodyEmpty响应体为空
ErrResponseBodyTooLarge响应体超出大小限制

文件错误

变量说明
ErrEmptyFilePath文件路径为空
ErrFileExists文件已存在

客户端错误

变量说明
ErrClientClosed客户端已关闭

变量匹配

go
if errors.Is(err, httpc.ErrClientClosed) {
    // 客户端已关闭
}
if errors.Is(err, httpc.ErrResponseBodyEmpty) {
    // 响应体为空
}

另见