← Next.js コース
9. error.tsx — 実行時エラーの受け皿
ページの処理中に予期しないエラーが起きたとき、画面全体が真っ白になる代わりに代替UIを出すには、app の各フォルダに error.tsx を置きます。これはそのフォルダ以下で起きたエラーを受け止めるエラーバウンダリとして働き、エラー時に default export したコンポーネントが表示されます。loading.tsx・not-found.tsx と並ぶ、もう1つの特別なファイルです。
error.tsx は、受け取った error オブジェクトでエラー内容を扱えます。実務ではエラーを記録(ログ送信)しつつ、ユーザーには分かりやすいメッセージと「やり直す」ボタンを見せるのが定番です。やり直しには再描画を試みる関数(下の例の unstable_retry)を使います。フォルダごとに置けるので、一部分だけが壊れても他の画面は生かしたまま、その範囲だけ代替表示にできます。
注意点は、error.tsx の先頭に "use client" が必要なことです(エラーバウンダリはクライアント側の仕組みのため)。また、これが受け止めるのは実行時に投げられたエラーで、URLが存在しない404は not-found.tsx 側の担当、と役割が分かれています。なお再試行用の関数名は Next.js のバージョンで変わることがあるため、実際に使うバージョンのドキュメントで確認しましょう。
サンプルコード(フレームワーク環境が必要なため表示のみ)
// app/dashboard/error.tsx — このフォルダ以下のエラーを受け止める
"use client"; // エラーバウンダリはClient Componentである必要がある
import { useEffect } from "react";
export default function Error({
error,
unstable_retry,
}: {
error: Error & { digest?: string };
unstable_retry: () => void;
}) {
useEffect(() => {
console.error(error); // エラー記録サービスへ送るなど
}, [error]);
return (
<main>
<h2>問題が発生しました</h2>
{/* 再描画を試みて回復を図る */}
<button onClick={() => unstable_retry()}>やり直す</button>
</main>
);
}