23.SpringCloud實戰項目-整合統一異常處理


簡介

  • PassJava-Learning項目是PassJava(佳必過)項目的學習教程。對架構、業務、技術要點進行講解。
  • PassJava 是一款Java面試刷題的開源系統,可以用零碎時間利用小程序查看常見面試題,夯實Java基礎。
  • PassJava 項目可以教會你如何搭建SpringBoot項目,Spring Cloud項目
  • 采用流行的技術,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。

更好的閱讀體驗

文檔連載目錄

整合統一異常處理

一、緣起

我們在寫代碼的時候,通常會在方法里面添加各種try catch來捕獲異常,會發現有很多重復的代碼,所以我們可以整合統一異常處理來優化代碼結構。

攔截異常並統一處理我們可以用到@RestControllerAdvice注解

二、自定義異常處理類

  • 添加統一異常處理類注解@RestControllerAdvice

  • 添加日志注解@Slf4j

  • 添加異常處理方法注解@ExceptionHandler

package com.jackson0714.passjava.question.exception;

/*
* 集中處理所有異常
 */
@Slf4j
@RestControllerAdvice(basePackages = "com.jackson0714.passjava.question.controller")
public class PassjavaExceptionControllerAdvice {

    @ResponseBody
    @ExceptionHandler(value= MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException e) {
        log.error("數據校驗出現問題{},異常類型:{}", e.getMessage(), e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        Map<String, String> errorMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach((fieldError)->{
            errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
        });

        return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap);
    }

    @ExceptionHandler(value=Throwable.class)
    public R handleException(Throwable throwable) {
        log.error("未知異常{},異常類型:{}", throwable.getMessage(), throwable.getClass());
        
        return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
    }
}

三、推薦的系統錯誤碼

1.錯誤碼和錯誤信息定義類

  • 1.錯誤碼長度:5個數字

  • 2.前兩位:業務場景

  • 3.后三位:錯誤碼

10:通用業務
	001:參數格式校驗錯誤(10001)
11:會員業務
12:題目業務
13:內容業務
14:學習業務

2.錯誤碼枚舉類

com.jackson0714.common.exception.BizCodeEnum

定義了兩種異常枚舉:系統未知異常、參數格式校驗失敗

package com.jackson0714.common.exception;

public enum BizCodeEnum {
    UNKNOWN_EXCEPTION(10000, "系統未知異常"),
    VALID_EXCEPTION(10001, "參數格式校驗失敗");

    private int code;
    private String msg;
    BizCodeEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

四、測試代碼

測試場景1:校驗參數displayOrder必須為正整數,如果displayOrder不為正整數,則會拋出異常

  • 1.實體類上添加校驗注解@Positive
/**
 * 排序
 */
@Positive
private Integer displayOrder;
  • 2.controller類里面添加save方法,並添加校驗參數注解@Valid
/**
* 保存
*/
@RequestMapping("/save")
public R save(@Valid @RequestBody QuestionEntity question){
    questionService.save(question);

    return R.ok();
}

測試:

用Postman工具調用save方法

請求地址:

http://192.168.10.160:8060/api/question/v1/admin/question/save

請求參數:

{
    "displayOrder": 0.2
}

返回結果:

{
    "msg": "參數格式校驗失敗",
    "code": 10001,
    "data": {
        "displayOrder": "必須是正數"
    }
}

測試場景2:對於代碼里面直接拋出的異常,也可以handle

1.controller類里面添加查詢題目的方法,並拋出Exception異常

/**
* 信息
*/
@RequestMapping("/info/{id}")
//@RequiresPermissions("question:question:info")
public R info(@PathVariable("id") Long id) throws Exception {
    QuestionEntity question = questionService.getById(id);
    throw new Exception("test");

    //return R.ok().put("question", question);
}

測試:

用Postman工具調用save方法

請求地址:

http://192.168.10.160:8060/api/question/v1/admin/question/save

返回結果:

{
    "msg": "系統未知異常",
    "code": 10000
}

證明統一處理方法被調用了:

@ExceptionHandler(value=Throwable.class)
public R handleException(Throwable throwable) {
    return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
}

代碼地址

https://github.com/Jackson0714/PassJava-Platform

公眾號

公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM