亚洲色蝴蝶中文娱乐网,在线亚洲欧美一区二区中文字幕,无人视频在线观看视频高清视频,99午夜国产精品一区二区,人人妻人人爽人人狠狠

Spring Boot中的全局異常處理

時(shí)間:2022-10-09 23:17:29 類型:JAVA
字號(hào):    

  在項(xiàng)目開發(fā)過(guò)程中,不管是對(duì)底層數(shù)據(jù)庫(kù)的操作過(guò)程,還是業(yè)務(wù)層的處理過(guò)程,還是控制層的處理過(guò)程,都不可避免會(huì)遇到各種可預(yù)知的、不可預(yù)知的異常需要處理。如果對(duì)每個(gè)過(guò)程都單獨(dú)作異常處理,那系統(tǒng)的代碼耦合度會(huì)變得很高,此外,開發(fā)工作量也會(huì)加大而且不好統(tǒng)一,這也增加了代碼的維護(hù)成本。

  針對(duì)這種實(shí)際情況,我們需要將所有類型的異常處理從各處理過(guò)程解耦出來(lái),這樣既保證了相關(guān)處理過(guò)程的功能單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。同時(shí),我們也不希望直接把異常拋給用戶,應(yīng)該對(duì)異常進(jìn)行處理,對(duì)錯(cuò)誤信息進(jìn)行封裝,然后返回一個(gè)友好的信息給用戶。

        方法如下:

  1. 定義返回的統(tǒng)一 json 結(jié)構(gòu)

import lombok.Data;

@Data
public class EJson {
    /**
     * 異常碼
     */
    protected String code;
    /**
     * 異常信息
     */
    protected String msg;
    public EJson() {
        this.code = "200";
        this.msg = "操作成功";
    }
    public EJson(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

  2. 處理系統(tǒng)異常

  新建一個(gè) GlobalExceptionHandler 全局異常處理類,

        @ControllerAdvice 注解即可攔截項(xiàng)目中拋出的異常

        @ResponseBody 注解是為了異常處理完之后給調(diào)用方輸出一個(gè) json 格式的封裝 數(shù)據(jù)。

如下:

        第一個(gè)攔截異常:參數(shù)缺失的時(shí)候,會(huì)拋出 HttpMessageNotReadableException

        第二個(gè)攔截異常:空指針異常,   NullPointerException

       以此類推: 可以定義更多的異常.....................

        最后把再定義一個(gè) Exception異常, 前邊沒(méi)有被攔截的異常,統(tǒng)統(tǒng)都會(huì)在這里被攔截

       Exception 異常是父類,所有異常都會(huì)繼承該異常,所以我們可以直接攔截 Exception 異常,一勞永逸

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
    // 打印log
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * 缺少請(qǐng)求參數(shù)異常
     * @param ex HttpMessageNotReadableException
     * @return
     */
    @ExceptionHandler(MissingServletRequestParameterException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public EJson handleHttpMessageNotReadableException(
            MissingServletRequestParameterException ex) {
            logger.error("缺少請(qǐng)求參數(shù),{}", ex.getMessage());
        return new EJson("400", "缺少必要的請(qǐng)求參數(shù)");
    }

    /**
     * 空指針異常
     * @param ex NullPointerException
     * @return
     */
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    public EJson handleTypeMismatchException(NullPointerException ex) {
        logger.error("空指針異常,{}", ex.getMessage());
        return new EJson("500", "空指針異常了");
    }

    /**
     * 系統(tǒng)異常 預(yù)期以外異常
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    public EJson handleUnexpectedServer(Exception ex) {
        logger.error("系統(tǒng)異常:", ex);
        return new EJson("500", "系統(tǒng)發(fā)生異常,請(qǐng)聯(lián)系管理員");
    }
}

定義控制器做個(gè)測(cè)試:

@RestController
    @RequestMapping("/exception")
public class ExceptionController {
        private static final Logger logger =
                LoggerFactory.getLogger(ExceptionController.class);
        @PostMapping("/test")
        public EJson test(@RequestParam("name") String name,
                          @RequestParam("sex") String sex) {
            logger.info("name:{}", name);
            logger.info("sex:{}", sex);
            return new EJson();
        }

        @RequestMapping("/null")
        public EJson test1(String name,String sex){
            if(sex.equals("男")){
                logger.info("性別:{}",sex);
            }
            return new EJson();
        }
        @RequestMapping("/byzero")
        public EJson test2(){
            int result = 1 / 0;
            return new EJson();
        }
    }

通過(guò)Postman訪問(wèn)做個(gè)測(cè)試

1.jpg2.jpg

3.jpg

<