#33 エラー処理 [共通エラー、HTTPエラー毎のエラー]

# #33 エラー処理 [共通エラー、HTTPエラー毎のエラー]
今回はエラー処理に関して学んでいきます。

# 前提条件
この記事はSpringの最低限の知識が必要になります。
また、なるべく分かりやすく書くつもりですが、この記事の目的は自分の勉強のアウトプットであるため所々説明は省略します。

# 構築環境
1. 各バージョン
Spring Boot ver 2.7.5
mybatis-spring-boot-starter ver 2.2.2
Model Mapper ver 3.1.0
jquery ver 3.6.1
bootstrap ver 5.2.2
webjars-locator ver 0.46
thymeleaf-layout-dialect ver 3.0.0

2. 依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/58b53ccd-7cf2-2d82-4214-9f0c08fced2e.png)

# 成果物
共通エラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/7211eff0-6da1-5493-0cbe-5f490c13a0a6.png)

HTTPエラー毎のエラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/5e2954b2-e1e6-8379-a08b-01b65f40975f.png)

# 今回行うこと
今回は以下の流れに沿って進めていきます。
1. エラー画面の作成
　1. 共通エラー画面
　2. HTTPエラー毎のエラー画面

## 1. エラー画面の作成
アプリケーション内で予期せぬエラーが発生した場合、Springでは以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/8e445298-a05f-64e3-adca-3a5d4816099e.png)

上記の画像はSpringが用意しているWhiteLabelというエラーページです。しかし、このままではエラーが起きた際にユーザーが何の操作をすれば良いか分からなく立ってしまいます。
そのため　共通の画面に遷移できる共通のエラー画面を作成します。

### 1. 共通エラー画面
共通エラー画面を作成するためにはsrc/main/resources/templatesの直下にerror.htmlというHTMLファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/bbfaacd0-0512-d701-caf2-b45fcd5cfadd.png)

HTMLファイルの内容は以下になります。
```html:error.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Error</title>
</head>
<body>
	<h1 th:text="${status} + ' ' + ${error}"></h1>
	<p th:text="${message}"></p>
	<p>ログイン画面に戻ってください</p>
	<form method="post" th:action="@{/logout}">
		<button class="btn btn-link" type="submit">ログイン画面に戻る</button>
	</form>
</body>
</html>
```

ここで上記のコードに含まれる各エラー内容を解説します。
|    コード   |             説明             |
|:-----------|:----------------------------:|
|  ${status} | HTTPのエラーコードが格納される |
|  ${error}  |  HTTPのエラー概要が表示される  |
| ${message} |  エラーメッセージが表示される  |
<br>

下記の画像は実際に上記のコードを実装し、一意制約違反を起こした際のエラーページです。
画像下部にある``ログイン画面に戻る``ボタンを押すとログイン前のページに戻ることができます。
- ${status}：500
- ${error} ：Internal Server Error
- ${message}：### Error updating database．．．values( ?, ?, ?, ?, ?, ?, ?, ? ) [23505-214]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/7211eff0-6da1-5493-0cbe-5f490c13a0a6.png)

### 2. HTTPエラー毎のエラー画面
Springのデフォルト機能を使えば、HTTPエラー毎のエラーが画面も用意することができます。
今回は存在しないURLにHTTPリクエストを送った際に発生する``404エラー``が起きた場合の画面を作成します。

HTTPエラー毎のエラー画面を作成するにはsrc/main/resources/templates/errorの直下にHTMLファイルを用意します。
ファイル名はHTTPエラーコードを同じにします。今回は``404エラー``に対応した画面を作成するため``404.html``というHTMLファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/3ea9885e-803a-4748-8c1b-54785dda4159.png)


HTMLファイルの内容は以下になります。
```html:error.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>404Error</title>
</head>
<body>
	<h1 th:text="${status} + ' ' + ${error}"></h1>
	<p th:text="${message}"></p>
	<p>これは、404エラーの専用ページです</p>
	<form method="post" action="@{/logout}">
		<button class="btn btn-link" type="submit">ログイン画面に戻る</button>
	</form>
</body>
</html>
```
<br>

下記の画像が存在しないURL(http://localhost:8080/hoge) にアクセスした際に発生したエラーです。
コード内には``<p th:text="${message}"></p>``を記述しましたが、``No message available``と出てきているのでいらなかったみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/5e2954b2-e1e6-8379-a08b-01b65f40975f.png)


# 最後に
今回は``共通エラー``、``HTTPエラー毎のエラー画面``を作成しました。