カテゴリ: React 更新日: 2025/12/18

ReactのuseEffectでエラー状態を管理する方法を徹底解説!初心者でもわかる非同期処理のエラーハンドリング

useEffectでエラー状態を管理する方法
useEffectでエラー状態を管理する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Reactでデータをサーバーから取ってくるとき、もし失敗したらどうすればいいですか?」

先生

「そのときに大切なのが『エラー状態の管理』です。エラーが起きたら何が問題なのかをユーザーに伝える仕組みを作ります。」

生徒

「なるほど!でもどうやってエラーを管理すればいいんですか?」

先生

「ReactではuseStateuseEffectを組み合わせて、エラーが起きたときの状態を作るんです。順番に説明しますね。」

1. エラー状態とは?

1. エラー状態とは?
1. エラー状態とは?

エラー状態とは、APIからデータを取ってくるときに問題が発生したことを記録しておく仕組みです。例えばサーバーが止まっていたり、インターネットが切れていたりするとデータが取得できません。そのときにエラー状態をtrueにして、画面に「エラーが発生しました」と表示すれば、ユーザーは「何か問題があるんだな」と理解できます。

2. useStateでエラーを管理する

2. useStateでエラーを管理する
2. useStateでエラーを管理する

Reactでは、useStateでエラーの内容を保存できます。例えば最初はnullにしておいて、問題が起きたときにエラーメッセージを代入します。これで「エラーがあるかないか」を判定できるようになります。

イメージとしては、空っぽの箱にエラーメッセージを入れておいて、箱の中身があるかどうかでエラーを判定するようなものです。

3. useEffectでエラーを検知するサンプルコード

3. useEffectでエラーを検知するサンプルコード
3. useEffectでエラーを検知するサンプルコード

実際にエラーを管理するReactのコードを見てみましょう。


import React, { useState, useEffect } from "react";

function App() {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch("https://jsonplaceholder.typicode.com/invalid-url");
        if (!response.ok) {
          throw new Error("サーバーからの応答が正しくありません");
        }
        const result = await response.json();
        setData(result);
      } catch (err) {
        setError(err.message);
      }
    };
    fetchData();
  }, []);

  return (
    <div>
      <h1>エラー状態のサンプル</h1>
      {error ? <p style={{ color: "red" }}>エラー: {error}</p> : <p>{data ? data.title : "データを読み込み中..."}</p>}
    </div>
  );
}

export default App;
(最初は「データを読み込み中...」と表示されますが、サーバーがエラーを返すと「エラー: サーバーからの応答が正しくありません」と表示されます)

4. finallyを使って状態を確実に更新する

4. finallyを使って状態を確実に更新する
4. finallyを使って状態を確実に更新する

エラー処理をするときは、必ずローディング状態も解除しなければなりません。これを忘れると画面がずっと「読み込み中」のままになります。そこでtry...catch...finallyを使うと便利です。

finallyはエラーが起きても起きなくても必ず実行される部分です。たとえば「ローディングを終了する」という処理をここに書いておけば、必ず実行されます。

5. エラーをユーザーにどう見せるか

5. エラーをユーザーにどう見せるか
5. エラーをユーザーにどう見せるか

エラーメッセージをそのまま英語で表示しても、初心者のユーザーにはわかりにくいことがあります。そこで以下の工夫が役立ちます。

  • 「インターネット接続を確認してください」とユーザーに行動を促す
  • 「サーバーで問題が発生しています」と簡単に伝える
  • 画面に赤い文字やアイコンを使ってエラーを目立たせる

こうした工夫をすることで、ただ「エラー」と出すよりもユーザーに優しい設計になります。

6. 実際のアプリでのエラー管理の活用例

6. 実際のアプリでのエラー管理の活用例
6. 実際のアプリでのエラー管理の活用例

エラー状態の管理はどんなアプリでも必須です。例えば以下のような場面で役立ちます。

  • ショッピングサイトで商品データが取れないとき
  • 天気予報アプリでサーバーが落ちているとき
  • ログイン処理で間違ったパスワードを入力したとき
  • チャットアプリでメッセージが送信できなかったとき

エラーをただ無視してしまうと、ユーザーは「アプリが壊れたのかな?」と不安になります。だからこそ、エラー状態を管理して「問題があります」と伝えることが大切なのです。

まとめ

まとめ
まとめ

useEffectでのエラー状態管理を振り返る

この記事では、Reactにおける非同期処理とエラーハンドリングについて、特にuseEffectを使ったエラー状態の管理方法を中心に解説してきました。API通信は必ず成功するとは限らず、通信エラーやサーバーエラー、想定外のレスポンスなど、さまざまな問題が発生します。そのため「エラーが起きる前提」で設計することが、安定したReactアプリを作るうえで非常に重要です。

エラー状態を管理するという考え方は、「失敗したらどうするか」をあらかじめ決めておくこととも言えます。useStateでエラー用の状態を用意し、useEffect内の非同期処理でtryとcatchを使ってエラーを検知することで、画面表示を安全に切り替えられるようになります。これにより、アプリが突然止まったり、何も表示されなくなったりする事態を防げます。

エラー状態を持つことの意味

エラー状態を持つ最大の意味は、「今の画面がどんな状況なのか」を明確にできる点にあります。データ取得中なのか、正常に取得できたのか、それとも問題が起きたのかをstateで分けて管理することで、Reactコンポーネントの役割がはっきりします。特に初心者のうちは、状態を言葉で説明できるように意識すると理解が深まります。

例えば「errorがnullなら正常」「errorに文字が入っていれば失敗」というルールを決めるだけでも、コードの読みやすさは大きく変わります。この考え方は、今後ローディング状態や成功状態を組み合わせるときにもそのまま応用できます。

エラー表示を工夫する重要性

エラーが起きたときに何を表示するかは、ユーザー体験に直結します。ただエラーメッセージを出すだけではなく、「どうすればよいか」を伝えることで、ユーザーの不安を減らせます。例えば「通信に失敗しました。時間をおいて再度お試しください」と表示するだけでも、印象は大きく変わります。

Reactでは条件分岐を使って、エラー時だけ特別なメッセージやスタイルを表示することが簡単にできます。エラー状態をstateとして管理しているからこそ、こうした柔軟な表示切り替えが可能になります。

エラー状態を含めたシンプルな考え方の例


if (error) {
  return <p>エラーが発生しました</p>;
}
if (!data) {
  return <p>データを読み込み中...</p>;
}
return <p>{data.title}</p>;
(エラーがある場合はエラーメッセージ、なければ読み込み中やデータ内容が表示されます)

このように「エラー」「読み込み中」「成功」の三つの状態を分けて考えるだけで、非同期処理の全体像が整理されます。複雑に見えるエラーハンドリングも、状態を一つずつ分けて考えれば決して難しいものではありません。

実務や学習で役立つポイント

useEffectでのエラー管理は、学習用のサンプルだけでなく、実際の開発現場でも頻繁に使われます。API連携がある限り、エラー処理は必ず必要になります。最初からエラー状態を意識してコードを書く癖をつけておくと、後から機能を追加するときにも困りにくくなります。

また、エラーをstateとして管理する考え方は、ログイン失敗、入力チェック、送信失敗など、さまざまな場面で応用できます。Reactの基礎として、非常に汎用性の高い知識と言えるでしょう。

先生と生徒の振り返り会話

生徒

「エラーって起きたら困るものだと思っていましたが、最初から想定しておくものなんですね。」

先生

「その通りです。非同期処理では、エラーは特別なものではなく、よくある出来事なんですよ。」

生徒

「useStateでエラーを持っておけば、画面の切り替えも分かりやすくなりました。」

先生

「状態を分けて考えられるようになると、Reactの理解が一段深まります。」

生徒

「これなら、通信が失敗しても落ち着いて対応できそうです。」

先生

「その感覚が大切です。エラーに強い設計ができるようになると、アプリ全体が安定しますよ。」

カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介