例外の種類
Webアプリケーションで発生する例外は、大きく3つに分類されます。
(1)システム例外
処理を継続することができない例外(アプリケーション自体のバグ、依存ライブラリのバグ、ミドルウェアやハードウェアの故障、システムリリースの枯渇、ネットワーク障害など)は、システム例外に分類されます。
システム利用者にはシステムエラー画面を表示し、システム運用者にはシステム障害が発生したことが通知されるように実装します。
(2)リクエスト不正を通知する例外
リクエストの内容が不正なときに発生する例外(存在しないパスへのリクエスト、バインディングエラー、入力チェックエラーなど)は、リクエスト不正を通知する例外に分類されます。
リクエスト不正を通知する例外が発生した場合は、システム利用者にリクエストの内容が間違っていることを通知するように実装します。
(3)アプリケーション例外
ビジネスルールに違反したときに発生する例外(ユーザー登録時のIDの重複エラー、排他エラー、在庫数の不足エラー)は、アプリケーション例外に分類されます。
アプリケーション例外が発生した場合は、アプリケーションの要件が決められているエラー処理を実装します。
例外の発生箇所とハンドリング方法
① Servlet Filter
Servlet Filterで発生する例外に対する例外ハンドリング。Servlet Filterの中で発生した例外例外は、サーブレットコンテナのエラーページ機能 (web.xmlの要素)を使用してエラー処理をする。
② DispatcherServlet
フロントコントローラーが行うフレームワーク処理で発生する例外に対する例外ハンドリング。
Spring MVCのフロントコントローラーで発生した例外は、Spring MVCが提供する例外ハンドリングの仕組み(HandlerExceptionResolver)を使用してエラー処理を実装する。
③ アプリケーション
Controller以降の処理(アプリケーションの個別の処理)で発生する例外ハンドリング。
アプリケーションの中で発生した例外は、プログラム内でのtry-catchやSpring MVCが提供する例外ハンドリング仕組み(HandlerExceptionResolver)を使用してエラー処理を実装する。
④ View(JSPなど)
View内で発生する例外に対する例外ハンドリング。
Viewの中で発生した例外は、サーブレットコンテナのエラーページ機能 (web.xmlの要素)を使用してエラー処理をする。
サーブレットコンテナのエラーページ機能の利用
サーブレットコンテナは、サーブレットコンテナまで通知された例外やエラー応答(HttpServletResponseのsendErrorメソッドの呼び出し)をハンドリングし、遷移先のページを指定することができる機能を提供しています。
※エラー時の遷移先ページは、web.xmlの要素を使用して設定します。
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/error/defailtError.jsp</location>
</error-page>