Menu

エラーハンドリング

このドキュメントでは、Next.js アプリケーションの開発、サーバーサイド、クライアントサイドのエラーを処理する方法について説明します。

開発時のエラー処理

Next.js アプリケーションの開発段階でランタイムエラーが発生すると、オーバーレイが表示されます。これは、ウェブページを覆うモーダルです。オーバーレイは、pnpm devnpm run devyarn dev、または bun dev を使用して開発サーバーを実行している場合にのみ表示され、本番環境では表示されません。エラーを修正すると、オーバーレイは自動的に非表示になります。

オーバーレイの例は以下の通りです:

開発モード時のオーバーレイの例

サーバーエラーの処理

Next.js はデフォルトで静的な 500 ページを提供し、アプリケーション内のサーバーサイドエラーを処理します。pages/500.js ファイルを作成することで、このページをカスタマイズすることもできます。

アプリケーションに 500 ページがあっても、アプリユーザーに具体的なエラーは表示されません。

file not found のような特定のランタイムエラーを処理するには、404 ページも使用できます。

クライアントエラーの処理

React の Error Boundaries は、アプリケーションの他の部分が引き続き機能するようにクライアント上の JavaScript エラーを優雅に処理する方法です。ページのクラッシュを防ぐだけでなく、カスタムのフォールバックコンポーネントを提供し、エラー情報をログに記録することもできます。

Next.js アプリケーションで Error Boundaries を使用するには、pages/_app.js ファイルで、クラスコンポーネント ErrorBoundary を作成し、Component プロップをラップする必要があります。このコンポーネントは以下の責務を持ちます:

  • エラーが発生した後、フォールバック UI をレンダリングする
  • アプリケーションの状態をリセットする方法を提供する
  • エラー情報をログに記録する

ErrorBoundary クラスコンポーネントは、React.Component を拡張して作成できます。例:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props)
 
    // エラーがあるかどうかを追跡する状態変数を定義
    this.state = { hasError: false }
  }
  static getDerivedStateFromError(error) {
    // 次のレンダリングでフォールバック UI を表示するように状態を更新
 
    return { hasError: true }
  }
  componentDidCatch(error, errorInfo) {
    // 独自のエラーロギングサービスをここで使用できます
    console.log({ error, errorInfo })
  }
  render() {
    // エラーが発生したかどうかをチェック
    if (this.state.hasError) {
      // カスタムのフォールバック UI をレンダリング
      return (
        <div>
          <h2>おっと、エラーが発生しました!</h2>
          <button
            type="button"
            onClick={() => this.setState({ hasError: false })}
          >
            もう一度試しますか?
          </button>
        </div>
      )
    }
 
    // エラーがない場合は子コンポーネントを返す
 
    return this.props.children
  }
}
 
export default ErrorBoundary

ErrorBoundary コンポーネントは hasError 状態を追跡します。この状態変数の値は真偽値です。hasError の値が true の場合、ErrorBoundary コンポーネントはフォールバック UI をレンダリングします。それ以外の場合は、子コンポーネントをレンダリングします。

ErrorBoundary コンポーネントを作成したら、pages/_app.js ファイルにインポートし、Next.js アプリケーションの Component プロップをラップします。

// ErrorBoundary コンポーネントをインポート
import ErrorBoundary from '../components/ErrorBoundary'
 
function MyApp({ Component, pageProps }) {
  return (
    // Component プロップを ErrorBoundary コンポーネントでラップ
    <ErrorBoundary>
      <Component {...pageProps} />
    </ErrorBoundary>
  )
}
 
export default MyApp

React のドキュメントで Error Boundaries について詳しく学べます。

エラーの報告

クライアントエラーを監視するには、Sentry、Bugsnag、または Datadog などのサービスを使用します。