springMVCの例外ハンドラの実装例(@ExceptionHandler編)

spring

springMVCのエラーハンドリングについて解説をします。springMVCのエラーハンドリングはいくつか方法があります。今回は「@ExceptionHandler」について解説します。

[スポンサーリンク]

エラーハンドリング「@ExceptionHandler」は、@ExceptionHandlerを実装したコントローラ内のみで有効(ハンドリングします)となります。
@ExceptionHandlerを実装していないコントローラ内では、例外をハンドリングしません。気をつけて下さい。

この章でやること

springMVCのハンドラクラスを作ります。(@ExceptionHandlerを使います。)

springMVCのバージョン

org.springframework-versionは、3.1.0を使っています。
javaは、1.6.0を使っています。

例外ハンドラクラスを作成します。

@Controller
public class ExceptionController {

	@ExceptionHandler(NullPointerException.class)
	public String NullPointerExceptionHandler() {
		System.out.println("NullPointerExceptionが発生しました。");
		return "error";
	}

	@ExceptionHandler(IllegalArgumentException.class)
	public String IllegalArgumentExceptionHandler() {
		System.out.println("IllegalArgumentExceptionが発生しました。");
		return "error";
	}

	@ExceptionHandler(Throwable.class)
	public String ThrowableHandler() {
		System.out.println("その他例外が発生しました。");
		return "error";
	}

	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/ex", method = RequestMethod.GET)
	public String home(Locale locale, Model model) throws Exception {

		// ここで意図的に例外を発生させています。
		throw new Exception();
	}
}

JSPを作成します。

例外ハンドラで指定しました、error.jspを作成します。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>error</title>
</head>
<body>
<h1>
    error!!
</h1>

</body>
</html>

springMVCのひな型の作成方法は、「springsource tool suite Webアプリを自動生成してみよう編」を参照して下さい。

実行結果

APIを実行するとログが出力されます。

ブラウザからの実行方法については、「springsource tool suite Webアプリを自動生成してみよう編」を参照して下さい。

実行結果

ログ

NullPointerExceptionが発生しました。

解説

@ExceptionHandlerで、例外種類を分けてメソッドを用意しています。
コントローラクラスで何の例外が発生した時に、どのメソッドを実行させるかはこのようにして決めることができます。
例えば、NullPointerExceptionが発生したときは、4行目のメソッドが実行されます。不明な例外(例えばSQLException等)が発生した時は、Throwableをした16行目のメソッドが実行されます。

HandlerExceptionResolverはspringMVCプロジェクト全体の例外をキャッチしていましたが、@ExceptionHandlerはコントローラ内の例外のみをキャッチします。
例えば、Aコントローラクラスで定義した@ExceptionHandlerでは、Bコントローラクラスで発生した例外はキャッチできません。

springMVCプロジェクト全体のエラーハンドリングついては、springMVCの例外ハンドラの実装例(HandlerExceptionResolver編)で解説しています。

最後に

springMVCでもstrutsと同様の例外ハンドリングが用意されています。例外処理を業務処理内でtry-catchするのではなく、例外処理と業務処理はクラスを分けて管理しましょう。その方が冗長的なコードを書かなくてもよいのと、将来的に業務処理クラスに修正が入った時、改修が楽になります。