【Next.js】エラー伝播の流れ図解で理解

# はじめに
　Next.jsで開発中に、このエラーはどこに向かって投げられているのか？という疑問から頭の整理をするため図にしてみました。
<br>
下記のように書いていました
```.blogs/page.tsx

async function Page() {
  const fetchAllBlogsData = async (): Promise<BlogResponse> => {
    const res = await fetch(`https://hoge.microcms.io/api/v1/blogs`, {
      next: { revalidate: 600 },
      headers: {
        "X-MICROCMS-API-KEY": process.env.CMS_API_KEY || "",
        "Content-Type": "application/json",
      },
    });
    if (!res.ok) throw new Error("データ取得に失敗しました");
    return await res.json();
  };
  const allBlogs = await fetchAllBlogsData();

  return (
    <div>
      <Header />
      <PageClient allBlogs={allBlogs} />
      </div>
  );
}

export default Page;

```

```.blogs/page.client.tsx
"use client";

const limit = 8;

function PageClient({ allBlogs }: { allBlogs: BlogResponse }) {
  const [currentPage, setCurrentPage] = useState(1);
  const totalPages = Math.ceil(allBlogs.contents.length / limit);
  return (
    <>
      <div className="flex items-center justify-between mt-4 mb-4 ml-10">
        <div className="cms-heading text-xl font-bold">ブログ記事一覧</div>
        <div>
          <Link
            href="/"
            className="btn mr-10 c-btn-slide4 px-6 py-2 font-bold text-[#fff] bg-[#5696e3] border border-[#5696e3] rounded">
            戻る
          </Link>
        </div>
      </div>

      <div className="grid justify-items-center md:grid-cols-2 gap-4 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 2xl:grid-row-2">
        {allBlogs.contents.map((blogs) => {
          return (
            <Link
              href={`/blogs/${blogs.id}`}
              key={blogs.id}
              className="image-animation card bg-base-100 w-96 shadow-lg">
              <figure>
                <Image src={CmsThumbnail} alt="画像" width={400} height={300} priority={true} />
              </figure>
              <div className="card-body bg-base-content/5">
                <p>{formattedDate(blogs.createdAt)}</p>
                <h2 className="card-title">{blogs.title}</h2>
              </div>
            </Link>
          );
        })}
      </div>

      <div className="grid grid-cols-3 items-center mt-4">
        <div></div>
        <div className="justify-self-center">
          <CmsClientSidePagenation currentPage={currentPage} totalPages={totalPages} onPageChange={setCurrentPage} />
        </div>
      </div>
    </>
  );
}

export default PageClient;

```
上記のコードの流れ

![通常の流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/d846e30d-2ed6-4014-b3d0-d9c2153c5493.png)



エラーが発生した場合

![try-catchしない流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/a1d1b063-2716-48cf-9bb7-33981ec8ce2c.png)


しかしこれだとエラーが発生した場合に任意の処理ができないため、一旦エラーをキャッチしたいという考え方もあるようです。
try-catchを使用するとエラーは一旦catchで捕まります。しかしキャッチしたままだとエラーがバウンダリーに投げられずerror.tsxの表示に影響する可能性があるため再throwしています。


```.blogs/page.tsx
try {
      const res = await fetch(`https://hoge.microcms.io/api/v1/blogs`, {
        next: { revalidate: 600 },
        headers: {
          "X-MICROCMS-API-KEY": process.env.CMS_API_KEY || "",
          "Content-Type": "application/json",
        },
      });
      if (!res.ok) throw new Error("データ取得に失敗しました");
      return await res.json();
    } catch (error) {
      console.error("データ取得エラー", error);
      throw error;
    }
```

![try-catchする流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3707255/5d3d633c-17ff-4475-abd9-6f5ebe1391f8.png)


# 参考
https://zenn.dev/takepepe/articles/nextjs-error-handling

https://nextjsjp.org/docs/app/building-your-application/routing/error-handling

# おわりに
文字だけの理解よりも図にするのが良いと改めて思いました。　

<br>


# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp