1. 程式人生 > >Spring Boot 自定義異常及統一異常處理

Spring Boot 自定義異常及統一異常處理

自定義異常

自定義異常要繼承RuntimeException

public class ShowtimeException extends RuntimeException {

    private Integer code;

    public ShowtimeException(ResultEnum resultEnum){
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }

    public Integer getCode() {
        return
code; } public void setCode(Integer code) { this.code = code; } }

異常處理類
用@ControllerAdvice申明的類可以在Spring掃描時自動掃描,在異常的處理中@ControllerAdvice會優先選擇用@ExceptionHandler標註的方法來做異常的處理。

@ControllerAdvice
public class ExceptionHandle {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
public Result handle(Exception e){ // 判斷異常是自定義異常 if (e instanceof ShowtimeException){ ShowtimeException showtimeException = (ShowtimeException) e; return ResultUtil.fail(showtimeException.getCode(), showtimeException.getMessage()); } else { return
ResultUtil.fail(-1, "e.getMessage()"); } } }

這樣當我們在程式碼中丟擲自定義異常時,就可以被捕獲,返回統一格式的結果
Controller中的程式碼為:

@GetMapping("/showtime/getAge/{id}")
    public void getAge(@PathVariable("id") Integer id) throws Exception {
        showtimeService.getAge(id);

    }

Service中的程式碼為:

@Service
public class ShowtimeService {

    @Autowired
    private ShowtimeRepository showtimeRepository;

    public void getAge(Integer id) throws Exception {
        Showtime showtime = showtimeRepository.getOne(id);
        Integer age = showtime.getAge();
        if (age < 10){
            throw new ShowtimeException(ResultEnum.ERROR_ONE);
        } if (age > 12 && age < 18){
            throw new ShowtimeException(ResultEnum.ERROR_TWO);
        }
    }
}
{
    "msg": "年齡大於12小於18",
    "code": 1,
    "data": null
}