Spring Boot异常处理
Spring Boot 异常处理
一、Spring Boot默认的异常处理
Spring Boot提供了一个默认处理异常的映射。在Spring Boot的Web项目中,尝试访问一个不存在的URL,会得到Spring Boot中内置的异常处理,提示如下:

同样的地址,如果发送的请求,请求的是JSON格式,则返回的JSON格式的错误结果,如下:

二、Spring Boot统一异常处理
在编写代码时,需要对异常进行处理。进行异常处理的普通的代码是try-catch结构。但在开发业务时,只想关注业务正常的代码,对于catch语句中的捕获异常,希望交给异常捕获来处理,不单独在每个方法中编写。如果我们不统一的处理异常,经常会在controller层有大量的异常处理代码。
Spring正好提供一个非常方便的异常处理方案———控制器通知(@ControllerAdvice或@RestcontrollerAdvice),它将所有的控制器作为一个切面,利用切面技术来实现。
通过基于@ControllerAdvice或@RestControllerAdvice的注解可以对异常进行全局统一处理,默认对所有的Controller有效。如果要限定生效范围,则可以食用ControllerAdvice支持的限定范围方式。


三、自定义业务异常类
- 自定义异常类
package com.kyk.imoocmall.exception;
/** 统一异常处理
* @FileName imooc-mall
* @Author keyongkang
* @Create 2022-11-25-14:58
*/
//自定义异常类继承RuntimeException
public class ImoocMallException extends RuntimeException {
// 自定义错误码
private final Integer code;
// 自定义错误消息
private final String msg;
// 自定义构造器,必须传入code和msg
public ImoocMallException(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
// 自定义构造器,必须传入一个异常枚举
public ImoocMallException(ImoocMallExceptionEnum exceptionEnum) {
this(exceptionEnum.getCode(), exceptionEnum.getMsg());
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
- 自定义全局捕获异常
package com.kyk.imoocmall.exception;
import com.kyk.imoocmall.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 处理统一异常的handler
* @FileName imooc-mall
* @Author keyongkang
* @Create 2022-11-25-15:31
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handleException(Exception e) {
// 记录下日志信息
log.error("Default Exception:", e);
return R.error(ImoocMallExceptionEnum.SYSTEM_ERROR);
}
/**
* 自定义业务处理业务异常类
* 如果出现这个异常,就会响应error信息
*/
@ExceptionHandler(ImoocMallException.class)
@ResponseBody
public Object handleImoocMallException(ImoocMallException e) {
// 记录下日志信息
log.error("ImoocMallException:", e);
return R.error(e.getCode(), e.getMsg());
}
}

浙公网安备 33010602011771号