コンテンツにスキップ

エラー処理

このドキュメントでは、開発、サーバーサイド、およびクライアントサイドのエラーを処理する方法について説明します。

開発中のエラー処理

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

オーバーレイの例を以下に示します

Example of an overlay when in development mode

サーバーエラーの処理

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

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

また、404ページを使用して、「ファイルが見つかりません」などの特定のランタイムエラーを処理することもできます。

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

Reactのエラーバウンダリは、アプリケーションの他の部分が動作し続けるように、クライアントサイドのJavaScriptエラーを適切に処理する方法です。ページのクラッシュを防ぐだけでなく、カスタムのフォールバックコンポーネントを提供したり、エラー情報をログに記録したりすることもできます。

Next.jsアプリケーションでエラーバウンダリを使用するには、`pages/_app.js`ファイルにクラスコンポーネント`ErrorBoundary`を作成し、`Component`プロップをラップする必要があります。このコンポーネントは、以下の役割を担います。

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

React.Componentを拡張することで、ErrorBoundaryクラスコンポーネントを作成できます。例えば

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props)
 
    // Define a state variable to track whether is an error or not
    this.state = { hasError: false }
  }
  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI
 
    return { hasError: true }
  }
  componentDidCatch(error, errorInfo) {
    // You can use your own error logging service here
    console.log({ error, errorInfo })
  }
  render() {
    // Check if the error is thrown
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return (
        <div>
          <h2>Oops, there is an error!</h2>
          <button
            type="button"
            onClick={() => this.setState({ hasError: false })}
          >
            Try again?
          </button>
        </div>
      )
    }
 
    // Return children components in case of no error
 
    return this.props.children
  }
}
 
export default ErrorBoundary

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

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

// Import the ErrorBoundary component
import ErrorBoundary from '../components/ErrorBoundary'
 
function MyApp({ Component, pageProps }) {
  return (
    // Wrap the Component prop with ErrorBoundary component
    <ErrorBoundary>
      <Component {...pageProps} />
    </ErrorBoundary>
  )
}
 
export default MyApp

Reactのドキュメントでエラーバウンダリについて詳しく学ぶことができます。

エラーの報告

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