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()stringMETHOD 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) {
    // レスポンスボディが空
}

関連項目