エラーハンドリング
エラーは予期されるエラーとキャッチされない例外の2つのカテゴリに分けられます:
- 予期されるエラーは戻り値としてモデル化する: サーバーアクションでは、予期されるエラーに対して
try
/catch
を使用せず、useFormState
を使用してこれらのエラーを管理し、クライアントに返します。 - 予期しないエラーにはエラーバウンダリを使用する:
error.tsx
とglobal-error.tsx
ファイルを使用してエラーバウンダリを実装し、予期しないエラーを処理し、フォールバックUIを提供します。
予期されるエラーの処理
予期されるエラーは、サーバー側のフォーム検証や失敗したリクエストなど、アプリケーションの通常の動作中に発生する可能性のあるエラーです。これらのエラーは明示的に処理され、クライアントに返される必要があります。
サーバーアクションからの予期されるエラーの処理
useFormState
フックを使用して、サーバーアクションの状態(エラーを含む)を管理します。この方法により、予期されるエラーに対して try
/catch
ブロックを避け、例外としてスローするのではなく、戻り値としてモデル化します。
次に、アクションを useFormState
フックに渡し、返された state
を使用してエラーメッセージを表示できます。
補足: これらの例は、Next.jsのApp RouterにバンドルされているReactの
useFormState
フックを使用しています。React 19を使用している場合は、代わりにuseActionState
を使用してください。詳細はReactのドキュメントを参照してください。
返された状態を使用して、クライアントコンポーネントからトーストメッセージを表示することもできます。
サーバーコンポーネントからの予期されるエラーの処理
サーバーコンポーネント内でデータをフェッチする場合、レスポンスを使用してエラーメッセージを条件付きでレンダリングしたり、redirect
したりできます。
キャッチされない例外
キャッチされない例外は、予期しないエラーであり、アプリケーションの通常のフローでは発生すべきでないバグや問題を示します。これらは例外をスローすることで処理され、エラーバウンダリによってキャッチされます。
- 一般的: ルートレイアウトの下にある
error.js
でキャッチされないエラーを処理します。 - オプション: ネストされた
error.js
ファイル(例:app/dashboard/error.js
)でキャッチされないエラーを細かく処理します。 - まれ:
global-error.js
を使用してルートレイアウトのキャッチされないエラーを処理します。
エラーバウンダリの使用
Next.jsはキャッチされない例外を処理するためにエラーバウンダリを使用します。エラーバウンダリは子コンポーネントのエラーをキャッチし、クラッシュしたコンポーネントツリーの代わりにフォールバックUIを表示します。
エラーバウンダリを作成するには、ルートセグメント内に error.tsx
ファイルを追加し、Reactコンポーネントをエクスポートします:
error
コンポーネントをレンダリングする際にスローすることで、親のエラーバウンダリにエラーを伝播させることができます。
ネストされたルートでのエラー処理
エラーは最も近い親のエラーバウンダリに伝播します。これにより、ルート階層の異なるレベルに error.tsx
ファイルを配置することで、細かいエラー処理が可能になります。
グローバルエラーの処理
あまり一般的ではありませんが、国際化を活用する際でも、ルートアプリディレクトリの app/global-error.js
を使用してルートレイアウトのエラーを処理できます。グローバルエラーUIは、アクティブ時にルートレイアウトまたはテンプレートを置き換えるため、独自の <html>
タグと <body>
タグを定義する必要があります。