青锋开源架构-springboot2.6.x+vue3-antdesign-vite之springboot全局异常

开源项目地址:

青锋开源架构-springboot2.6.x+vue3-antdesign-vite: 青锋-springboot2.6.x+vue3-antdesign-vite开源架构,实现了系统管理模块、权限控制模块(菜单权限、功能按钮权限、数据权限)、代码生成器(单表、树表)、quartz动态定时器等功能。

https://gitee.com/msxy/qingfeng-springboot-vue3-antdesign-vite

异常注解介绍

@ControllerAdvice

@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。

这里ControllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行切面环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。@ControllerAdvice是在类上声明的注解,其用法主要有三点:

1.结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的。

2.结合方法型注解@InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。

3.结合方法型注解@ModelAttribute,表示其注解的方法将会在目标Controller方法执行之前执行。

@ExceptionHandler

配合 @ExceptionHandler注解结合使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等.

@ExceptionHandler的作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。

代码实现

自定义异常类

package com.qingfeng.framework.exception;

/**
* @ProjectName BizException
* @author Administrator
* @version 1.0.0
* @Description 自定义一个异常类,用于处理我们发生的业务异常
* @createTime 2022/1/12 9:33
*/
public class BizException extends RuntimeException {
    
    private static final long serialVersionUID = 1L;
    
    /**
    * 错误码
    */
    protected String errorCode;
    /**
    * 错误信息
    */
    protected String errorMsg;
    
    public BizException() {
        super();
    }
    
    public BizException(FrontResult errorInfoInterface) {
        super(errorInfoInterface.getCode());
        this.errorCode = errorInfoInterface.getMessage();
        this.errorMsg = errorInfoInterface.getMessage();
    }
    
    public BizException(FrontResult errorInfoInterface, Throwable cause) {
        super(errorInfoInterface.getCode(), cause);
        this.errorCode = errorInfoInterface.getCode();
        this.errorMsg = errorInfoInterface.getMessage();
    }
    
    public BizException(String errorMsg) {
        super(errorMsg);
        this.errorMsg = errorMsg;
    }
    
    public BizException(String errorCode, String errorMsg) {
        super(errorCode);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
    
    public BizException(String errorCode, String errorMsg, Throwable cause) {
        super(errorCode, cause);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
    
    
    public String getErrorCode() {
        return errorCode;
    }
    
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
    
    public String getErrorMsg() {
        return errorMsg;
    }
    
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
    
    public String getMessage() {
        return errorMsg;
    }
    
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }
    
}

统一异常处理

package com.qingfeng.framework.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.sql.SQLException;

/**
* @ProjectName GlobalExceptionHandler
* @author Administrator
* @version 1.0.0
* @Description 全局异常拦截器
* @createTime 2022/1/11 21:41
*/
@ControllerAdvice//使用该注解表示开启了全局异常的捕获
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    
    /**
    * 处理自定义的业务异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value = BizException.class)
    @ResponseBody
    public  FrontResult bizExceptionHandler(HttpServletRequest req, BizException e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生业务异常!原因是:{}",e.getErrorMsg());
        return FrontResult.getExceptionResult(e.getErrorCode(),e.getErrorMsg());
    }
    
    /**
    * 处理空指针的异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value =NullPointerException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, NullPointerException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生空指针异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.NULLPOINTERFAIL.getMsg());
    }
    
    /**
    * 处理索引越界异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value =IndexOutOfBoundsException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, IndexOutOfBoundsException e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("索引越界异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.INDEXOUTOFBOUNDSFAIL.getMsg());
    }
    
    /**
    * 处理类未找到异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value =ClassNotFoundException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, ClassNotFoundException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生类未找到异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.CLASSNOTFOUNDFIL.getMsg());
    }
    
    
    /**
    * 处理SQL异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value = SQLException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, SQLException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生SQL异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.SQLFAIL.getMsg());
    }
    
    /**
    * 处理IO异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value = IOException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, IOException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生IO异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.IOFAIL.getMsg());
    }
    
    
    /**
    * 处理其他异常
    * @param req
    * @param e
    * @return
    */
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, Exception e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("未知异常!原因是:",e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResutlMsgEnum.OTHERFAIL.getMsg());
    }
    
}

前端返回值类

package com.qingfeng.framework.exception;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FrontResult {
    /**
    * 结果状态码
    */
    private String code;
    /**
    * 响应结果描述
    */
    private String message;
    /**
    * 返回数据
    */
    private Object data;
    
    /**
    * 静态方法,返回前端实体结果
    *
    * @param code    状态码
    * @param message 消息
    * @param data    数据
    * @return 前端实体结果
    */
    public static FrontResult build(String code, String message, Object data) {
        return new FrontResult(code, message, data);
    }
    
    /**
    * 返回成功的结果实体
    *
    * @param message 消息
    * @param data    数据
    * @return 实体
    */
    public static FrontResult getSuccessResult(String message, Object data) {
        FrontResult result = new FrontResult();
        result.code = ResultCodeEnum.SUCCESS.getCode();
        result.message = message;
        result.data = data;
        return result;
    }
    
    /**
    * 返回无需data的成功结果实体
    *
    * @param message 消息内容
    * @return 返回结果
    */
    public static FrontResult getSuccessResultOnlyMessage(String message) {
        FrontResult result = new FrontResult();
        result.code = ResultCodeEnum.SUCCESS.getCode();
        result.message = message;
        result.data = null;
        return result;
    }
    
    /**
    * 获取一个异常结果
    *
    * @param code 错误码
    * @param message 自定义异常信息
    * @return FrontResult
    */
    public static FrontResult getExceptionResult(String code, String message) {
        FrontResult result = new FrontResult();
        result.code = code.isEmpty() ? ResultCodeEnum.FAIL.getCode() : code;
        result.message = message.isEmpty() ? ResultCodeEnum.FAIL.getMsg() : message;
        return result;
    }
}

定义返回枚举类

package com.qingfeng.framework.exception;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public enum ResultCodeEnum {
    // 操作成功
    SUCCESS("200"),
    // 操作失败
    FAIL("500", "代码内部异常");
    
    /**
    * 状态码
    */
    private String code;
    
    public String getCode() {
        return code;
    }
    
    ResultCodeEnum(String code) {
        this.code = code;
    }
    
    private String msg;
    
    public String getMsg() {
        return msg;
    }
    
}
package com.qingfeng.framework.exception;

public enum ResutlMsgEnum {
    
    //操作成功
    SUCCESS("操作成功!"),
    //操作失败
    FAIL("操作失败!"),
    
    //空指针异常
    NULLPOINTERFAIL("空指针异常!"),
    //索引越界异常
    INDEXOUTOFBOUNDSFAIL("索引越界异常!"),
    //处理类未找到异常
    CLASSNOTFOUNDFIL("处理类未找到异常!"),
    //处理SQL异常
    SQLFAIL("处理SQL异常!"),
    //处理SQL异常
    IOFAIL("处理IO异常!"),
    //其他异常
    OTHERFAIL("系统内部异常!");
    
    
    private String msg;
    
    ResutlMsgEnum(String msg) {
        this.msg = msg;
    }
    
    public String getMsg() {
        return msg;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值