エラー処理
このドキュメントでは、開発、サーバーサイド、およびクライアントサイドのエラーを処理する方法について説明します。
開発中のエラー処理
Next.jsアプリケーションの開発フェーズ中にランタイムエラーが発生した場合、ウェブページを覆うモーダルである**オーバーレイ**が表示されます。これは、`pnpm dev`、`npm run dev`、`yarn dev`、または `bun dev` を使用して `next dev` で開発サーバーを実行している場合に**のみ**表示され、本番環境では表示されません。エラーを修正すると、オーバーレイは自動的に閉じます。
オーバーレイの例を以下に示します
サーバーエラーの処理
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などのサービスを使用します。
これは役に立ちましたか?