【React.js/Next.js】React Error Boundary 完全入門

React.js / Next.js

React Error Boundary って、どんな機能があるのかな?

今回は、React.js コンポーネントのレンダリングやライフサイクル内で発生したエラーをキャッチし、アプリのクラッシュを防ぐための仕組みである Error Boundary について解説します。

React.js の環境構築がまだの場合は、下記より環境構築を行なってください。

Error Boundary とは?

Error Boundary とは、React.js 16 以降で導入された仕組み で、コンポーネントのレンダリングやライフサイクル内で発生したエラーをキャッチ し、アプリ全体のクラッシュを防ぎつつ、代わりにフォールバック UI を表示するための機能 です。

なぜ Error Boundary が必要なの?

React.js 16 以前 では、コンポーネントのレンダリング中にエラーが発生すると、アプリ全体が壊れた状態のまま表示され続けるという問題 がありました。

そこで React.js 16 以降 では Error Boundary が導入され、特定のコンポーネントで発生したエラーをキャッチできる ようになりました。
これにより、UI が真っ白になるのを防ぎ、壊れたコンポーネントだけを安全に置き換えることが可能 になりました。
その結果、アプリ全体のクラッシュを防ぎ、より安全な UI を実現できる ようになりました。

Error Boundary がキャッチできるエラー

Error Boundary は、UI のレンダリングフェーズ(レンダリング・ライフサイクル)で発生したエラーをキャッチする仕組み です。
イベントハンドラや非同期処理で発生したエラーは Error Boundary 対象外 となるため、try/catchPromise.catch などによる 別途エラーハンドリングが必要 になります。

種類キャッチできる具体例
レンダリング中のエラーrender() 内での undefined 参照など
ライフサイクルメソッド内のエラーcomponentDidMount 内での例外
子コンポーネントのエラー配下コンポーネントのレンダーエラー
イベントハンドラ内のエラーonClick 内の例外
try/catch で対応可能
非同期処理のエラーsetTimeout / Promise の例外
try/catchPromise.catch で対応可能

Error Boundary のインストールと基本的な使い方

それでは、ここから実際に Error Boundary を インストール したり、コンポーネントで利用する 基本的な流れを見ていきましょう。

Error Boundary のインストール

関数コンポーネントでも使用できる react-error-boundary を インストール します

Error Boundary の基本的な使い方

コメントアウトのON/OFFで、エラー処理を発生させるコンポーネントを作成

処理内容

  1. MyComponent 正常に表示」が表示される
  2. throw new Error のコメントアウトを外し、エラーを発生 させる
  3. エラーが発生」と表示される

ボタンで、エラーをON/リセット(OFF)にするコンポーネントの作成

  • resetErrorBoundary: FallbackComponent 内で呼び出すと、Error Boundaryエラー状態をリセットして通常のレンダリングに戻す処理を行う関数
  • onReset: Error Boundaryprop として渡し、Error Boundary がリセットされたとき(resetErrorBoundary が呼ばれたとき)に、追加で状態初期化やログ送信などの処理を行うコールバック関数

処理内容

  1. MyErrorBoundaryComponent」と「コンポーネントは正常に表示されています」と「エラーON」のボタンが表示される
  2. エラーON」ボタンを押すと、「エラーが発生!!」と「リセット(エラーOFF)」 ボタンが表示され、「エラーON」ボタンが無効化される
  3. リセット(エラーOFF)」ボタンを押すと、再び「MyErrorBoundaryComponent」と「コンポーネントは正常に表示されています」と「エラーON」のボタンが表示される
  4. 再度「エラーON」ボタンを押すと、再び「エラーが発生!!」と「リセット(エラーOFF)」 ボタンが表示され、「エラーON」ボタンが無効化される
  5. 再度「リセット(エラーOFF)」ボタンを押すと、また「MyErrorBoundaryComponent」と「コンポーネントは正常に表示されています」と「エラーON」のボタンが表示される

イベントハンドラのエラーと非同期処理のエラーの場合のコンポーネントの作成

イベントハンドラのエラー非同期処理のエラー の場合、Error Boundary でキャッチすることはできないが、try/catchuseErrorBoundary を用いてエラーをキャッチする

イベントハンドラ内や非同期処理(Promise / setTimeout)で発生したエラー は、通常の Error Boundary では 自動的にキャッチされない ため、try/catch や Promise.catch でエラーをキャッチ し、useErrorBoundary を使って Error Boundary にエラーを渡す必要があります。

処理内容

  1. MyUseErrorBoundaryComponent」と「クリックカウント: 0」、「カウント増加」ボタン、「クリックイベントハンドラ でエラー発生」ボタン、「setTimeout でエラー発生」ボタン、「Promise でエラー発生」のボタンが表示される
  2. カウント増加」ボタンを5回押しても、エラーは発生せず、「クリックカウント: 5」になる
  3. クリックイベントハンドラ でエラー発生」ボタンを押すと、「クリックイベントで発生したエラー!」と「リセット」ボタンが表示され、「リセット」ボタンで エラー前の画面に戻る
  4. setTimeout でエラー発生」ボタンを押すと、2秒後 に「setTimeout で発生した非同期エラー!」と「リセット」ボタンが表示され、「リセット」ボタンで エラー前の画面に戻る
  5. Promiseでエラー発生」ボタンを押すと、「Promise で発生した非同期エラー!」と「リセット」ボタンが表示され、「リセット」ボタンで エラー前の画面に戻る

まとめ

Error Boundary について解説してきましたが、いかがでしたでしょうか?

Error Boundary は、コンポーネントのレンダリングやライフサイクル内で発生したエラーをキャッチ し、UI が真っ白になるのを防ぎ、通常の画面の代わりにエラー用の画面へ切り替える ための仕組み です。

まずは Error Boundary の基本的な使い方をしっかり押さえ、小さな コンポーネント で試しながら、より安定した品質の高いコード で開発できるようになっていきましょう。

公式サイト

react-error-boundary

Just a moment...
tachu × tachu

Laravel / React フルスタックエンジニア

Webエンジニア歴15年、フリーランス歴8年で、PHP / Laravel を中心に、
React.js / Vue.js を用いたフルスタックでのWeb開発をしています。

技術記事は Laravel / React / Web開発 を中心に書いています。

Webサービスの開発、既存システム改善、機能追加、技術相談、小規模な開発など、お気軽にご相談ください。

React.js / Next.js
シェアする

コメント

タイトルとURLをコピーしました