2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

💥Reactで「落ちない」アプリを作る!Error Boundaryの完全ガイド【初心者でもわかる】

Posted at

こんにちは!アミットです👨‍💻
Reactでアプリを作っていると、**突然画面が真っ白に…**そんな経験ありませんか?

それ、もしかして**「Error Boundary」**があれば防げたかも!

今回は、「Reactでアプリがクラッシュしない仕組み」=Error Boundary(エラーバウンダリ)について、図解と実例コードでやさしく解説します!


🧠 なぜ Error Boundary が必要なの?

Reactでは、レンダリング中に子コンポーネントでエラーが起きると、親もろともアプリ全体が落ちることがあります。

❌ 1つの小さなミスで、画面全体が真っ白に…

これを防ぐのが Error Boundary
ざっくり言うと、「エラーを検知して、代わりのUIを表示する防波堤」 です。


💡 Error Boundaryって何者?

React公式によると:

エラーバウンダリとは、JavaScriptエラーをキャッチして代替UIを表示する特別なクラスコンポーネントです。

✅ 特徴まとめ

  • クラスコンポーネントでしか使えない(Hooksでは未対応)
  • 対象は子コンポーネントのエラーのみ
  • エラーが起きたらアプリ全体がクラッシュせず、代替UIを表示

📦 最小構成の Error Boundary を作ってみよう

import React from "react";

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 次のレンダリングでフォールバックUIを表示
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // エラーのログを外部サービスなどに送ることも可能
    console.error("❗エラーが発生しました:", error, info);
  }

  render() {
    if (this.state.hasError) {
      return <h2>⚠️ 何か問題が発生しました。</h2>;
    }

    return this.props.children;
  }
}

export default ErrorBoundary;

🧪 実践:エラーを起こす子コンポーネントを囲ってみる

import React from "react";
import ErrorBoundary from "./ErrorBoundary";

const BuggyComponent = () => {
  throw new Error("💣 バグが発生しました!");
};

const App = () => {
  return (
    <div>
      <h1>React エラーバウンダリ デモ</h1>
      <ErrorBoundary>
        <BuggyComponent />
      </ErrorBoundary>
    </div>
  );
};

export default App;

✅ 結果:BuggyComponentが爆発しても、ErrorBoundaryがキャッチして画面は落ちません!


🎯 どんなときに使えばいいの?

  • ダッシュボードなど複雑なUIのパーツごとにErrorBoundaryを分けて配置
  • 外部ライブラリを使っていてエラーが起きる可能性があるとき
  • ユーザーに安定した体験を提供したいとき(特にプロダクション環境)

🚧 Error Boundary がキャッチできない例

以下のようなエラーはキャッチ不可です:

理由
イベントハンドラ内のエラー try-catchで自前で処理が必要
非同期処理(Promise)内のエラー .catch()が必要
サーバーサイドレンダリング中のエラー クライアントサイドでしか動かない
useEffect内の非同期エラー try-catch+.catch()で明示的に処理

🎁 おまけ:複数箇所に使うTips

<ErrorBoundary>
  <Navbar />
</ErrorBoundary>

<ErrorBoundary>
  <Dashboard />
</ErrorBoundary>

<ErrorBoundary>
  <Footer />
</ErrorBoundary>

➡️ UIを「パーツ単位」で保護できます。
ある部分だけ落ちても、他は無事!


🏆 ベストプラクティスまとめ

✅ クラスコンポーネントで作る
✅ UIパーツ単位で囲う
✅ ログ収集サービス(例:Sentry)と連携する
✅ ユーザーにフレンドリーなエラーメッセージを表示する


📌 まとめ

項目 内容
機能 子コンポーネントのエラーをキャッチし、フォールバックUIを表示
書き方 クラスコンポーネントとして定義
使いどころ 複雑なUI、外部ライブラリの利用、プロダクション環境

✍️ 最後に一言

Error Boundaryを使えば、「アプリ全体が真っ白になる恐怖」から解放されます!
これを使わないのは、エアバッグなしで車を運転するようなものかも…😅

💬 「使ったことがある」「他の使い方も知りたい」など、コメントでぜひ教えてください!


📚 公式リファレンスもチェック

👉 https://ja.reactjs.org/docs/error-boundaries.html


📌 Qiitaタグ案:

React JavaScript エラーハンドリング 初心者向け フロントエンド

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?