# データ取得失敗時のエラーハンドリング

例えばバックエンドで何らかのエラーがでてデータが取得できない場合、現状のコードだとデータが表示されず、エラーの原因がわかりません。そのため、データ取得部分にてエラーハンドリンを行いましょう。

先ほど`axios.get`にて`promise`型が返却され、処理が終わったら、`.then`にて処理結果を取得できると説明しましたが、**正確には処理が成功した場合の処理を受け取ることができます。**&#x5931;敗した場合に関しては、`.catch`とすることで、失敗した場合の処理結果を取得することができます。では、失敗した場合の返却値をコンソールにて確認してみましょう。

一旦存在しないURLに置き換えてエラーを起こしてみましょう。

<pre class="language-tsx" data-title="PostList.tsx◎"><code class="lang-tsx">...
  useEffect(() => {
    axios
<strong>      .get&#x3C;Post[]>("https://invalid")
</strong>      .then((res) => {
        setPostList(res.data);
      })
<strong>      .catch((e) => {
</strong><strong>        console.log(e);
</strong><strong>      });
</strong>  }, [userId]);
...
</code></pre>

そうすると、`catch`内の処理がはしり処理結果がコンソールに出力されます。

確認すると`AxiosError`型のオブジェクトが確認できます。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F8hqhLze4AyiA4aHayheN%2Ferror1208.png?alt=media&#x26;token=5aecbc04-f564-4208-a4cf-de7376556993" alt=""><figcaption></figcaption></figure>

では、エラーが発生した際に`message`を`errorMessage`というstateで管理して、画面上に表示するようにしましょう。表示部分はbootstrapのアラートを使用します。

{% embed url="<https://getbootstrap.jp/docs/5.3/components/alerts/>" %}

<pre class="language-tsx" data-title="PostList.tsx◎"><code class="lang-tsx">...
  const [userId, setUserId] = useState(1);
<strong>  const [errorMessage, setErrorMessage] = useState("");
</strong>...
  useEffect(() => {
    axios
      .get&#x3C;Post[]>("https://invalid")
      .then((res) => {
        console.log(res);
        setPostList(res.data);
      })
      .catch((e) => {
<strong>        setErrorMessage(e.message);
</strong>      });
  }, [userId]);
...
<strong>      {errorMessage !== "" &#x26;&#x26; (
</strong><strong>        &#x3C;div className="alert alert-danger" role="alert">
</strong><strong>          {errorMessage}
</strong><strong>        &#x3C;/div>
</strong><strong>      )}
</strong>      &#x3C;table className="table">
...
</code></pre>

上記にて以下のように表示が確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FHrjgPwR6snPZZM9iV0Wz%2Faaaaa.png?alt=media&#x26;token=c26075a2-c417-408e-bf5b-f26aab3f8bf8" alt=""><figcaption></figcaption></figure>

確認できたら、URLの方を元に戻しましょう。

<pre class="language-tsx" data-title="PostList.tsx◎"><code class="lang-tsx">...
  useEffect(() => {
    axios
<strong>      .get&#x3C;Post[]>("https://jsonplaceholder.typicode.com/posts")
</strong>      .then((res) => {
        setPostList(res.data);
      })
...
</code></pre>
