© TOOLS BOX — Next.js / React / TypeScript コードサンプル集

サンプルガイド
←サンプル一覧
nextjserror-handling

Next.js App Router の error.tsx でエラーハンドリングを実装する

App Router の error.tsx を使い、セグメント単位で非同期エラーをキャッチしてフォールバック UI を表示する実装例。

難易度: 中級·更新: 2026-04-16

対応バージョン

nextjs 15react 19

前提環境

Next.js App Router のルーティング基礎(layout.tsx / page.tsx)を理解していること

概要

Next.js App Router では、error.tsx を配置するとそのセグメント配下で発生したエラーを React の Error Boundary としてキャッチできる。 page.tsx での fetch エラーや例外をフォールバック UI で受け取り、reset() で再試行も提供できる。

インストール

# 追加インストールは不要

基本構成(error.tsx)

// app/dashboard/error.tsx
"use client";

import { useEffect } from "react";

type Props = {
  error: Error & { digest?: string };
  reset: () => void;
};

export default function DashboardError({ error, reset }: Props) {
  useEffect(() => {
    // エラーログ送信など
    console.error(error);
  }, [error]);

  return (
    <div className="flex flex-col items-center gap-4 py-16">
      <p className="text-sm text-gray-600">データの読み込みに失敗しました</p>
      <button
        onClick={reset}
        className="rounded bg-blue-600 px-4 py-2 text-sm text-white hover:bg-blue-700"
      >
        再試行する
      </button>
    </div>
  );
}

エラーを発生させる page.tsx の例

// app/dashboard/page.tsx
async function fetchData() {
  const res = await fetch("https://api.example.com/data");
  if (!res.ok) throw new Error("データの取得に失敗しました");
  return res.json();
}

export default async function DashboardPage() {
  const data = await fetchData();
  return <div>{JSON.stringify(data)}</div>;
}

global-error.tsx(ルートレイアウトのエラー用)

ルートの layout.tsx 自体でエラーが発生した場合は error.tsx ではキャッチできない。 app/global-error.tsx を用意することでカバーできる。

// app/global-error.tsx
"use client";

export default function GlobalError({
  reset,
}: {
  error: Error & { digest?: string };
  reset: () => void;
}) {
  return (
    <html>
      <body>
        <div className="flex flex-col items-center gap-4 py-16">
          <p className="text-sm">予期しないエラーが発生しました</p>
          <button onClick={reset} className="rounded bg-gray-800 px-4 py-2 text-sm text-white">
            再読み込み
          </button>
        </div>
      </body>
    </html>
  );
}

ポイント

  • error.tsx は必ず "use client" にする。Server Component 側のエラーをクライアントの Error Boundary が受け取る設計のため
  • reset() を呼ぶと、そのセグメントのサーバーコンポーネントを再レンダリングしてリカバリを試みる
  • error.tsx は同階層の layout.tsx の内側でしか機能しない。layout.tsx 自体のエラーは親セグメントの error.tsx または global-error.tsx でキャッチする
  • error.digest はサーバー側のエラー詳細が含まれる可能性がある(本番では外部に漏らさない)

注意点

error.tsx は必ず 'use client' にする必要がある。Server Component 側のエラーはクライアントの Error Boundary が受け取る設計のため。

関連サンプル

同じテーマや技術スタックを使った実装例

  • Next.js で not-found.tsx を使ってカスタム 404 ページを作る

    notFound() 関数と not-found.tsx を組み合わせてカスタム 404 ページを実装する例。動的ルートでリソースが存在しない場合の処理パターンを示す。

  • Next.js の global-error.tsx でルートレベルのエラーをキャッチする

    app/global-error.tsx を使い、ルートレイアウトを含む最上位のランタイムエラーをキャッチして reset ボタンで回復する実装例。error.tsx との責務の違いも示す。

  • React で再試行ボタン付きの ErrorBoundary を実装する

    エラー発生時に「再試行」ボタンを表示し、state リセットで再レンダリングを促す ErrorBoundary パターンの実装例。

  • Next.js Route Handler でエラーレスポンスを型安全に統一する

    Route Handler のエラーレスポンスを型付きで統一し、400 / 404 / 500 を一貫して扱うラッパー関数を実装する例。try/catch パターンとエラー型の整理も示す。

  • Next.js で権限不足(forbidden)時の専用ページを表示する

    認証済みで操作は許可されているが特定リソースへのアクセス権限がない場合に forbidden ページを表示し、unauthorized との使い分けを示す例。

関連仕様

このサンプルを理解するのに役立つ仕様や概念

  • FrameworkNext.jsReact ベースのフルスタックフレームワーク。SSR・SSG・App Router・API Routes を提供する。
←サンプル一覧に戻る