Files
cpp-httplib/docs-src/pages/ja/cookbook/s13-error-handler.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

2.1 KiB

title, order, status
title order status
S13. カスタムエラーページを返す 32 draft

404や500のようなハンドラが返したエラーレスポンスを加工したいときは、set_error_handler()を使います。エラーレスポンスのボディはデフォルトでは空ですが、エラーハンドラで独自のHTMLやJSONを入れられます。

基本の使い方

svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
  auto body = "<h1>Error " + std::to_string(res.status) + "</h1>";
  res.set_content(body, "text/html");
});

エラーハンドラは、res.statusが4xxまたは5xxでレスポンスが返る直前に呼ばれます。res.set_content()で差し替えれば、すべてのエラーレスポンスで同じテンプレートが使えます。

ステータスコード別の処理

svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
  if (res.status == 404) {
    res.set_content("<h1>Not Found</h1><p>" + req.path + "</p>", "text/html");
  } else if (res.status >= 500) {
    res.set_content("<h1>Server Error</h1>", "text/html");
  }
});

res.statusを見て分岐すれば、404には専用のメッセージを、5xxにはサポート窓口のリンクを、といった使い分けができます。

JSON APIのエラーレスポンス

APIサーバーなら、エラーもJSONで返したいことが多いはずです。

svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
  nlohmann::json j = {
    {"error", true},
    {"status", res.status},
    {"path", req.path},
  };
  res.set_content(j.dump(), "application/json");
});

これで全エラーが統一されたJSONで返ります。

Note: set_error_handler()は、ルートハンドラが例外を投げた場合の500エラーにも呼ばれます。例外そのものの情報を取り出したい場合はset_exception_handler()を組み合わせましょう。S14. 例外をキャッチするを参照してください。