天天看點

JAVA全局異常處理 1、問題引入2、代碼編寫

目錄

 1、問題引入

2、代碼編寫

 1、問題引入

我們需要對程式中可能出現的異常進行捕獲,通常有兩種處理方式:

  1. 使用 try...catch 直接進行異常捕獲,但是這種方式太繁瑣了,難不成我有一個異常我就要寫一次try...catch嗎?雖然可以解決,但是存在弊端代碼備援,不通用。
  2. 使用異常處理器進行全局異常捕獲,采用這種方式來實作,我們隻需要在項目中定義一個通用的全局異常處理器,就可以解決本項目的所有異常。

2、代碼編寫

在項目中自定義一個全局異常處理器,在異常處理器上加上注解 @ControllerAdvice,可以通過屬性annotations指定攔截哪一類的Controller方法。

JAVA全局異常處理 1、問題引入2、代碼編寫

建立好全局異常處理器後,我們就可以去編寫異常處理方法。

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
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.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局異常處理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class  GlobalExceptionHandler {

    /**
     * 異常處理方法 @ExceptionHandler 來指定攔截的是那一類型的異常。
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        // 列印異常資訊 例如 : Duplicate entry '666' for key 'idx_username'
        log.error(ex.getMessage());
        // 判斷異常資訊是否包括
        if(ex.getMessage().contains("Duplicate entry")){
            // 異常資訊有空格,是以我們可以通過空格進行截取 獲得一個數組
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            // 傳回異常處理資訊
            return R.error(msg);
        }
        return R.error("未知錯誤");
    }
}
           

上述的全局異常處理器上使用了的兩個注解 @ControllerAdvice , @ResponseBody , 他們的作用分别為:

  1. @ControllerAdvice : 指定攔截那些類型的控制器;
  2. @ResponseBody: 将方法的傳回值 R 對象轉換為json格式的資料, 響應給頁面;

上述使用的兩個注解, 也可以合并成為一個注解 @RestControllerAdvice