SpringBoot 項目全局異常處理

前提

爲何使用全局異常處理?

由於咱們咱們項目開發過程當中遇到各類異常,咱們單獨處理的話性能較低,也不靈活,用戶顯示的的是一堆英文的提示,因此咱們一會兒就乾點這種異常,因此咱們須要全局異常處理,java

準備

首先咱們建立一個 異常包,包裏面建立一個類數據庫

咱們的這個異常處理配合Lombok來配合處理

image.png

這個類是咱們的全局異常類,

簡單的全局異常

@Slf4j //lombok中的日誌處理註解
@RestControllerAdvice //全局異常
public class GolbalException {
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
 public String GolbalRuntimeException(RuntimeException e){
        log.error("RuntimeException.exception {}",e.getMessage());
        return e.getMessage();
    }
}
@Slf4J(這個註解是Lombok的日誌處理註解)
@RestControllerAdvice(這個註解表示的是當前的類是全局異常處理類)
@ExceptionHandle(這個註解描述controller層處理的異常方法)
@ResponseBody(這個註解描述java對象轉換json格式)

思路:

第一步:首先咱們建立一個包,包裏面建立一個類
第二部:進入類上面定義日誌註解和全局異常註解
第三步:類裏定義controller層處理的異常處理註解
第四步:異常處理註解裏面寫處理的異常類型
第五步:類裏面建立返回值是String類型的對象
第六步:對象裏面寫日誌若是有異常的話打印
第七步:return返回打印的結果

響應標準設計

什麼是響應標準?

咱們的數據到客戶端裏,咱們對這些數據進行狀態設計,
假如如今響應的數據包含三種 好比:狀態,消息,具體數據等...json

前提

首先咱們要建立新的包,而後包裏面建立類
image.pngsegmentfault

設計響應數據

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class viewTable<T> {
    private Integer state=1;//狀態碼 表示1 ok,表示0 error
    private String message;//狀態信息
    private List<T> rows; //封裝查詢結果
    public viewTable(String message){
         this.message=message;
    }
    public viewTable(List<T> list) {
        this.rows=list;
    }
    public viewTable(Throwable e){
        this.state=0;
        this.message=e.getMessage();
    }
}

咱們基於Lombak來實現

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor

@Data--這個註解Lombak的註解 自動生成get和set以及tostring
@Accessors--這個註解的做用getter和setter方法的方法名都是屬性名
@NoArgsConstructor--生成無參構造
@AllArgsConstructor--生成有參構造服務器

首先咱們指定頁面中顯示的數據形式

private Integer state=1;//狀態碼 表示1 ok,表示0 error
private String message;//狀態信息
private List<T> rows; //封裝查詢結果

state--狀態 給頁面發送 1表示正常 0表示錯誤
message -- 狀態信息 成功的話 ok 錯誤的 報異常
rows -- 咱們顯示的數據數據結構

下面的是類型封裝

public viewTable(String message){
     this.message=message;
}
public viewTable(List<T> list) {
    this.rows=list;
}
public viewTable(Throwable e){
    this.state=0;
    this.message=e.getMessage();
}

第一個 --- 若是返回的結果是字符串
第二個 --- 若是返回的結果是查詢的數據
第三個 --- 若是返回的數據是異常性能

這樣咱們給頁面顯示的數據成功封裝好了

全局異常處理(高級)

前言

如今咱們響應數據結構和初級異常處理 接下來咱們把兩個都合起來this

@Slf4j //lombok中的日誌處理註解
@RestControllerAdvice //全局異常
public class GolbalException<T> {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public viewTable GolbalRuntimeException(Exception e){
        viewTable<T> v=new viewTable<>();
        v.setState(0);
        if (e instanceof BadSqlGrammarException){
            v.setMessage("數據庫異常");
        }else if (e instanceof RuntimeException){
            v.setMessage("服務器異常");
        }
        log.error("RuntimeException.exception {}",e.getMessage());
        return v;
    }
}

解釋

咱們把類的類型改爲咱們的響應結構的類型 就是viewTable
咱們new一個剛纔設計的響應類
獲取裏面的狀態碼設計爲0
咱們要判斷 若是異常時關於SQL的 那麼給客戶端發送數據庫異常
若是異常時關於Runtime的 那麼給客戶端發送服務器異常
異常是 不是這兩個那麼客戶端發送異常的自己信息
後面return 給響應頁面的類

結果

報錯的異常

SQL異常

image.png

客戶端顯示

image.png

相關文章
相關標籤/搜索