第3回/例外処理
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[第3回]]
* 例外処理 [#a8f302bb]
- テキストはパワーポイント参照のこと
** 例外処理を加えたレイヤ構造 [#d9912640]
- &attachref(controller_advice.png);
*** 解説 [#r435b950]
- コントローラ・アドバイス(@ControllerAdvice)は,各レイヤ...
まとめて受け取って処理する''例外処理専用''のクラス
- コントローラ・アドバイスの各メソッドは,例外の種類に応...
-- 例外マッピング(例外→メソッド)
-- メソッドの前にアノテーション@ExceptionHandler(例外クラ...
- メソッドの中では,例外時の処理(例:ログを取る)および...
- 例外処理メソッドをコントローラ・アドバイスを定義せずに...
-- その場合は,そのコントローラが呼び出すサービス以下の例...
-- コントローラでキャッチできなかった例外は,アドバイスで...
-- それでもキャッチできない場合は,White Labelの画面が出る
** ToDoアプリの例外処理 [#u10d8988]
*** ControllerAdvice - コントローラ・アドバイス[#bda0508b]
- controller/ToDoErrorHandler.java
package jp.ac.kobe_u.cs.itspecialist.todoapp.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.Controlle...
import org.springframework.web.bind.annotation.Exception...
import jp.ac.kobe_u.cs.itspecialist.todoapp.exception.To...
import lombok.extern.slf4j.Slf4j;
/**
* ToDoアプリの例外ハンドラクラス
*/
@Slf4j
@ControllerAdvice
public class ToDoErrorHandler {
/**
* アプリケーション例外をハンドルし,エラーページを...
*/
@ExceptionHandler(ToDoAppException.class)
public String handleToDoException(ToDoAppException e...
model.addAttribute("advice", "アプリケーション例...
model.addAttribute("exception", ex);
log.error(ex.getMessage());
return "error";
}
/**
* その他の例外をハンドルし,エラーページを表示する
*/
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, Model mo...
model.addAttribute("advice", "深刻なエラーが発生...
model.addAttribute("exception", ex);
log.error(ex.getMessage(), ex.getCause());
return "error";
}
}
解説
- 1つ目のメソッドは,ToDoアプリのアプリケーション例外をキ...
-- アプリ内で想定している例外
- 2つ目のメソッドは,それ以外の任意の例外をキャッチする
-- アプリでは想定していない例外
- サンプルでは,エラーページに例外オブジェクトを渡し,ペ...
--- もっと丁寧にやるには,エラーコードに応じて,適切なエ...
String message;
switch (ex.getCode()) {
case 101:
message = "メンバーが存在しません"; break;
case 102:
message = "そのメンバーIDは既に使われています"; break;
...
}
*** エラー画面 - HTMLテンプレート [#ad09c77a]
- resources/templates/error.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>エラー</title>
</head>
<body>
<h1>エラー</h1>
<img th:src="@{/img/todo_error.png}" width="320px">...
<h3>
[[${advice}]]
</h3>
<p style="color:red">
[[${exception.message}]]
</p>
<input type="button" onclick="history.back()" value=...
</body>
</html>
*** 画像 [#l2d070d8]
- resources/static/img/todo_error.png
-- &attachref(./todo_error.png,50%);
終了行:
[[第3回]]
* 例外処理 [#a8f302bb]
- テキストはパワーポイント参照のこと
** 例外処理を加えたレイヤ構造 [#d9912640]
- &attachref(controller_advice.png);
*** 解説 [#r435b950]
- コントローラ・アドバイス(@ControllerAdvice)は,各レイヤ...
まとめて受け取って処理する''例外処理専用''のクラス
- コントローラ・アドバイスの各メソッドは,例外の種類に応...
-- 例外マッピング(例外→メソッド)
-- メソッドの前にアノテーション@ExceptionHandler(例外クラ...
- メソッドの中では,例外時の処理(例:ログを取る)および...
- 例外処理メソッドをコントローラ・アドバイスを定義せずに...
-- その場合は,そのコントローラが呼び出すサービス以下の例...
-- コントローラでキャッチできなかった例外は,アドバイスで...
-- それでもキャッチできない場合は,White Labelの画面が出る
** ToDoアプリの例外処理 [#u10d8988]
*** ControllerAdvice - コントローラ・アドバイス[#bda0508b]
- controller/ToDoErrorHandler.java
package jp.ac.kobe_u.cs.itspecialist.todoapp.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.Controlle...
import org.springframework.web.bind.annotation.Exception...
import jp.ac.kobe_u.cs.itspecialist.todoapp.exception.To...
import lombok.extern.slf4j.Slf4j;
/**
* ToDoアプリの例外ハンドラクラス
*/
@Slf4j
@ControllerAdvice
public class ToDoErrorHandler {
/**
* アプリケーション例外をハンドルし,エラーページを...
*/
@ExceptionHandler(ToDoAppException.class)
public String handleToDoException(ToDoAppException e...
model.addAttribute("advice", "アプリケーション例...
model.addAttribute("exception", ex);
log.error(ex.getMessage());
return "error";
}
/**
* その他の例外をハンドルし,エラーページを表示する
*/
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, Model mo...
model.addAttribute("advice", "深刻なエラーが発生...
model.addAttribute("exception", ex);
log.error(ex.getMessage(), ex.getCause());
return "error";
}
}
解説
- 1つ目のメソッドは,ToDoアプリのアプリケーション例外をキ...
-- アプリ内で想定している例外
- 2つ目のメソッドは,それ以外の任意の例外をキャッチする
-- アプリでは想定していない例外
- サンプルでは,エラーページに例外オブジェクトを渡し,ペ...
--- もっと丁寧にやるには,エラーコードに応じて,適切なエ...
String message;
switch (ex.getCode()) {
case 101:
message = "メンバーが存在しません"; break;
case 102:
message = "そのメンバーIDは既に使われています"; break;
...
}
*** エラー画面 - HTMLテンプレート [#ad09c77a]
- resources/templates/error.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>エラー</title>
</head>
<body>
<h1>エラー</h1>
<img th:src="@{/img/todo_error.png}" width="320px">...
<h3>
[[${advice}]]
</h3>
<p style="color:red">
[[${exception.message}]]
</p>
<input type="button" onclick="history.back()" value=...
</body>
</html>
*** 画像 [#l2d070d8]
- resources/static/img/todo_error.png
-- &attachref(./todo_error.png,50%);
ページ名: