1. 程式人生 > >07-SpringBoot之WEB(五)——異常處理

07-SpringBoot之WEB(五)——異常處理

SpringBoot之WEB(五)

1. 異常頁面

編寫模擬異常丟擲程式碼如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by HuangJun
 * 14:06 2018/11/9
 */
@RestController
public class ExceptionController {
    @RequestMapping("/exception")
    public Object exception() throws Exception{
/*** * 模擬異常丟擲 */ throw new Exception("My Exception"); } }

瀏覽器訪問http://localhost:8080/test/exception,執行結果如下圖
在這裡插入圖片描述

該頁面的內容對使用者來說不友好,我們可以自定義一個友好的提示系統異常的頁面。
在 src/main/resources 下建立 /public/error,在該目錄下再建立一個名為 5xx.html 檔案,該頁面的內容就是當系統報錯時返回給使用者瀏覽的內容:

<!DOCTYPE html>
<html lang="zh"> <head> <meta charset="UTF-8"> <title>系統錯誤</title> </head> <body> <div> <h2>系統內部錯誤</h2> </div> </body> </html>

500異常返回頁面效果
在這裡插入圖片描述

再自定義一個404返回頁面,在 /public/error 目錄下再建立一個名為 404.html 的檔案:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>訪問異常</title>
</head>
<body>
<div>
    <h2>找不到頁面</h2>
</div>
</body>
</html>

404異常返回頁面效果:
404異常返回頁面效果

2. 全域性異常捕獲

假設專案前後端是通過 JSON 進行資料通訊,編寫一個充當全域性異常的處理類GlobalDefaultExceptionHandler,需要使用 @ControllerAdvice 和 @ExceptionHandler 註解:

import com.springboot.web.exception.MyException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by HuangJun
 * 14:34 2018/11/9
 */
@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map<String,Object> defaultExceptionHandler(Exception e) {

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("code", 500);
        map.put("msg", e.getMessage());
        return map;
    }

}

其中,方法名為任意名,入參一般使用 Exception 異常類,方法返回值可自定義。

瀏覽器訪問 http://localhost:8080/test/exception,結果如下圖:
在這裡插入圖片描述

3. 自定義異常

3.1 建立一個自定義異常類

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by HuangJun
 * 14:39 2018/11/9
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends RuntimeException{

    private String code;  //異常狀態碼

    private String message;  //異常資訊

    private String method;   //發生的方法,位置等

    private String descinfo;   //描述
}

3.2 在GlobalDefaultExceptionHandler.java檔案中新增MyException處理

 /***
     * 自定義異常
     * @param myex
     * @return
     */
    @ExceptionHandler(value = MyException.class)
    public Object myExceptionHandler(MyException myex){
        Map<String,Object> map  = new HashMap<String,Object>();
        map.put("code",myex.getCode());
        map.put("message",myex.getMessage());
        map.put("method",myex.getMethod());
        map.put("descinfo",myex.getDescinfo());

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("myException");
        modelAndView.addObject("ex", map);
        return modelAndView;

    }

3.3 新建MyException異常處理返回頁面,在目錄resources\templates下建立myException.ftl

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>我的異常頁</title>
</head>
<body>
<div class="container">
    <h2>我的異常頁</h2>
    <ul>
        <li>code: ${ex.code}</li>
        <li>message: ${ex.message}</li>
        <li>method: ${ex.method}</li>
        <li>descinfo: ${ex.descinfo}</li>
    </ul>
    </table>
</div>

</body>
</html>

3.4 模擬MyException異常丟擲

  @RequestMapping(value = "/myException")
    public String myException(HttpServletRequest request ) throws Exception{
        String name =  "";
        if(StringUtils.isEmpty(name)){
            System.out.println(request.getRequestURL());
            throw new MyException("1001","empty",request.getRequestURL().toString(),"在獲取使用者名稱字的時候為空");
        }
        return name;
    }

3.5 執行結果

瀏覽器訪問http://localhost:8080/test/myException,執行結果如下:
在這裡插入圖片描述

4. 原始碼下載

原始碼下載地址:https://download.csdn.net/download/huangjun0210/10775125