第3回
例外処理†
例外処理を加えたレイヤ構造†
- File not found: "controller_advise.png" at page "第3回/例外処理"[添付]
- コントローラ・アドバイス(@ControllerAdvise)は,各レイヤで投げられた例外を
まとめて受け取って処理する例外処理専用のクラス
- コントローラ・アドバイスの各メソッドは,例外の種類に応じた処理をメソッドとして定義する
- メソッドの中では,例外時の処理(例:ログを取る)およびエラー画面の生成指示を行う
- 例外処理メソッドをコントローラ・アドバイスを定義せずに,コントローラ書いてもよい
- その場合は,そのコントローラが呼び出すサービス以下の例外を優先的にキャッチする
- コントローラでキャッチできなかった例外は,アドバイスで受ける
- それでもキャッチできない場合は,White Labelの画面が出る
ToDoアプリの例外処理†
package jp.ac.kobe_u.cs.itspecialist.todoapp.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import jp.ac.kobe_u.cs.itspecialist.todoapp.exception.ToDoAppException;
import lombok.extern.slf4j.Slf4j;
/**
* ToDoアプリの例外ハンドラクラス
*/
@Slf4j
@ControllerAdvice
public class ToDoErrorHandler {
/**
* アプリケーション例外をハンドルし,エラーページを表示する
*/
@ExceptionHandler(ToDoAppException.class)
public String handleToDoException(ToDoAppException ex, Model model) {
model.addAttribute("advice", "アプリケーション例外が発生しました.メッセージを確認してください");
model.addAttribute("exception", ex);
log.error(ex.getMessage());
return "error";
}
/**
* その他の例外をハンドルし,エラーページを表示する
*/
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, Model model) {
model.addAttribute("advice", "深刻なエラーが発生しました.管理者にお問い合わせください");
model.addAttribute("exception", ex);
log.error(ex.getMessage(), ex.getCause());
return "error";
}
}
エラー画面 - HTMLテンプレート†
- resources/static/img/todo_error.png