Files
cpp-httplib/docs-src/pages/ja/cookbook/c17-error-codes.md
T
yhirose 9bfd2ddf1c Fix README and docs pages that no longer match the code
Bring the READMEs and the docs pages (en and ja) in line with the
current header:

- Fix the client sample that does not compile, the Transfer-Encoding
  statement for default headers, the verifier callback comment, the
  thread pool spawn rule, the sanitize_filename description, and the
  inverted Accept-Encoding sentence.
- Describe recent behaviour: TLS errors behind Read/Write failures,
  Host validation, Connection: close for a body without length,
  content_reader rules, refused CONNECT, WebSocketClient proxies,
  CPPHTTPLIB_INTERIM_RESPONSE_MAX_COUNT, the SSE event size limit, and
  the payload limit of the Stream API.
- Complete the API references of WebSocket, WebSocketClient and the
  stream:: helpers, and the SSE reconnect rules.
- Fix cookbook pages: keychain loading on every backend, received Close
  status, a multipart sample that trusted the client's file name, an
  echo sample that sent binary as text, SNI, pre-request handler scope,
  stop() with WebSocket handlers, and the thread pool notes.
- Restore the mutex in the LLM app's Chapter 5 code.
2026-10-18 10:13:57 -04:00

3.2 KiB
Raw Blame History

title, order, status
title order status
C17. エラーコードをハンドリングする 17 draft

cli.Get()やcli.Post()はResult型を返します。リクエストが失敗したとき(サーバーに到達できなかった、タイムアウトしたなど)、返り値は「falsy」になります(例外が1つあり、下の表で説明します)。詳しい原因を知りたい場合はResult::error()を使います。

基本の判定

httplib::Client cli("http://localhost:8080");
auto res = cli.Get("/api/data");

if (res) {
  // リクエストが送れて、レスポンスも受け取れた
  std::cout << "status: " << res->status << std::endl;
} else {
  // ネットワーク層で失敗した
  std::cerr << "error: " << httplib::to_string(res.error()) << std::endl;
}

if (res)で成功・失敗を判定し、失敗時はres.error()でhttplib::Error列挙値を取り出せます。to_string()に渡すと人間が読める文字列になります。

代表的なエラー

値 意味
Error::Connection サーバーに接続できなかった。または、使えないURL(authorityにuserinfoやバックスラッシュがある、ポートが不正など)からClientを作った。後者の場合はcli.is_valid()がfalseになる
Error::ConnectionTimeout 接続タイムアウト(set_connection_timeout)
Error::Read / Error::Write 送受信中のエラー。set_read_timeoutやset_max_timeoutによるタイムアウトもError::Readになる
Error::Timeout stream::Get()やSSEClientで、ボディの読み取りがタイムアウトした
Error::ExceedRedirectCount リダイレクト回数が上限を超えた
Error::SSLConnection TLSハンドシェイクに失敗
Error::SSLServerVerification サーバー証明書の検証に失敗
Error::ProxyConnection プロキシがCONNECTのトンネルを拒否した。ただし407は例外で、resはtruthyかつres->status == 407になり、res.error()はError::ProxyConnectionのまま
Error::Canceled 進捗コールバック、ContentReceiver、ResponseHandler、アップロード用のコンテンツプロバイダのいずれかからfalseが返された

ステータスコードとの使い分け

resがtruthyでも、HTTPステータスコードが4xxや5xxのこともあります。この2つは別物です。

auto res = cli.Get("/api/data");
if (!res) {
  // ネットワークエラー(そもそもレスポンスを受け取れていない)
  std::cerr << "network error: " << httplib::to_string(res.error()) << std::endl;
  return 1;
}

if (res->status >= 400) {
  // HTTPエラー(レスポンスは受け取った)
  std::cerr << "http error: " << res->status << std::endl;
  return 1;
}

// 正常系
std::cout << res->body << std::endl;

ネットワーク層のエラーはres.error()、HTTPのエラーはres->status、と頭の中で分けておきましょう。

SSL関連のエラーをさらに詳しく調べたい場合はC18. SSLエラーをハンドリングするを参照してください。