iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

Day21 - Error Handling

前言

昨日簡短的介紹了Template Engine - Themleaf,接著我們討論當web後端產生Exception時Spring Boot提供了什麼樣的錯誤處理機制

專案建立

create module

https://ithelp.ithome.com.tw/upload/images/20231007/201280841oSUCu0kMB.png
https://ithelp.ithome.com.tw/upload/images/20231007/20128084uywBugNuEb.png

controller

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        //拋出異常
        int i = 1/0;
        return "index";
    }
}

Error Handling

錯誤處理自動配置

配置內容都在ErrorMvcConfiguration中

錯誤處理機制

錯誤的處理機制可以分為兩個部份,上面的HandlerExceptionResolver是由Spring MVC提供的,當無法處理的時候會導到下方的BasicErrorController處理,這個部份Spring Boot又可在分為請求JSON或是請求頁面,
https://ithelp.ithome.com.tw/upload/images/20231007/2012808445UrF4syjQ.png

demo

在未設任何ExceptionHandler的情況下訪問不存在頁面,會導到Whitelabel Error Page
https://ithelp.ithome.com.tw/upload/images/20231007/20128084wz3dPVppmJ.png
訪問後端1/0的頁面
https://ithelp.ithome.com.tw/upload/images/20231007/20128084SEOwio5aXU.png
模擬API訪問
https://ithelp.ithome.com.tw/upload/images/20231007/201280842G2pxConA7.png
設定handleException,發生異常時會被此Handler捕獲

@ExceptionHandler
public String handleHellException(Exception e){
    return "發生錯誤了GG:"+e.getMessage();
}

https://ithelp.ithome.com.tw/upload/images/20231007/20128084DlmBu4hON4.png
加入統一錯誤處理的Controller,標註@ControllerAdvice

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    @ResponseBody
    public String handleException(Exception e){

        return "GlobalExceptionHandler:"+e.getMessage();
    }
}

https://ithelp.ithome.com.tw/upload/images/20231007/20128084vwCdjAzomz.png
將GlobalExceptionHandler註解,測試BasicErrorController
https://ithelp.ithome.com.tw/upload/images/20231007/20128084baw5ZPHPrR.png
加入5xx.html
https://ithelp.ithome.com.tw/upload/images/20231007/20128084DXK0Q9PQMq.png
加入500.html
https://ithelp.ithome.com.tw/upload/images/20231007/20128084VjYpYz3s4o.png

實戰設定

  • 前後端分離
    • 後端錯誤,由@ControllerAdvice與@Exception進行統一處理
  • 前後端分離
    • 不可預知的錯誤
      • 在classpath:/templates/error/下放置精確錯誤代碼or不精確的頁面
    • 業務邏輯錯誤
      • 核心業務,由try catch,捕捉到的跳到自己錯誤頁面
      • 通用業務,由classpath:/templates/error.html顯示錯誤訊息

Reference


上一篇
Day20 - Thymeleaf
下一篇
Day22 - Embedded Web Servers
系列文
我在 Spring Boot 3 裡面挖呀挖呀挖31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言