目錄
1、問題引入
2、代碼編寫
1、問題引入
我們需要對程式中可能出現的異常進行捕獲,通常有兩種處理方式:
- 使用 try...catch 直接進行異常捕獲,但是這種方式太繁瑣了,難不成我有一個異常我就要寫一次try...catch嗎?雖然可以解決,但是存在弊端代碼備援,不通用。
- 使用異常處理器進行全局異常捕獲,采用這種方式來實作,我們隻需要在項目中定義一個通用的全局異常處理器,就可以解決本項目的所有異常。
2、代碼編寫
在項目中自定義一個全局異常處理器,在異常處理器上加上注解 @ControllerAdvice,可以通過屬性annotations指定攔截哪一類的Controller方法。

建立好全局異常處理器後,我們就可以去編寫異常處理方法。
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 , 他們的作用分别為:
- @ControllerAdvice : 指定攔截那些類型的控制器;
- @ResponseBody: 将方法的傳回值 R 對象轉換為json格式的資料, 響應給頁面;
上述使用的兩個注解, 也可以合并成為一個注解 @RestControllerAdvice