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支持的限定范围方式。

三、自定义业务异常类

  1. 自定义异常类
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;
    }
}
  1. 自定义全局捕获异常
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());
    }
}

https://blog.csdn.net/Linging_24/article/details/126077782

posted @ 2022-11-28 11:14  Ac_c0mpany丶  阅读(200)  评论(0)    收藏  举报