spring统一异常处理

如果是spring cloud 项目则需要在base模块中添加相应的统一异常处理,如果是单体项目则在config文件夹下添加统一异常处理.

添加的主要方式是基于注解开发的异常处理办法:

1.@ExceptionHandler 

   spring提供的标注异常类处理方法的注解,用在方法上或者类上,用来表明方法处理的异常的类型.(后面的括号中主要添加要处理的异常类,可以是自定义的也可以是java自带的)  

2.@ControllerAdvice Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强, 在项目中来增强 SpringMVC中的Controller。通常和 @ExceptionHandler 结合使用,来处理SpringMVC的异常 信息。

3.@ResponseStatus Spring3.0提供的标识在方法上或类上的注解,用状态代码和应返回的原因标记方法或异常类。 调用处理程序方法时,状态代码将应用于HTTP响应。

1.定义一些通用的异常信息

package com.xuecheng.base.exception;


/**
 * @description 通用错误信息
 * @author Mr.M
 * @date 2022/9/6 11:29
 * @version 1.0
 */
public enum CommonError {

	UNKOWN_ERROR("执行过程异常,请重试。"),
	PARAMS_ERROR("非法参数"),
	OBJECT_NULL("对象为空"),
	QUERY_NULL("查询结果为空"),
	REQUEST_NULL("请求参数为空");

	private String errMessage;

	public String getErrMessage() {
		return errMessage;
	}

	private CommonError( String errMessage) {
		this.errMessage = errMessage;
	}

}

2.自定义异常类型:(用于清晰的说明有预期的异常的处理)

package com.xuecheng.base.exception;

/**
 * @author YCL
 * @version 1.0
 * @description TODO
 * @date 2023-01-31 17:50
 */
public class XueChengPlusException extends RuntimeException{

    private String errMsg;

    public XueChengPlusException() {
        super();
    }

    public XueChengPlusException(String message) {
        super(message);
        this.errMsg = message;
    }

    public String getErrMsg() {
        return errMsg;
    }

    public static void cast(CommonError commonError){
        throw new XueChengPlusException(commonError.getErrMessage());
    }

    public static void cast(String message){
        throw new XueChengPlusException(message);
    }
}

3.响应用户的统一类型

package com.xuecheng.base.exception;

import java.io.Serializable;

/**
 * 错误响应参数包装
 */
public class RestErrorResponse implements Serializable {

    private String errMessage;

    public RestErrorResponse(String errMessage){
        this.errMessage= errMessage;
    }

    public String getErrMessage() {
        return errMessage;
    }

    public void setErrMessage(String errMessage) {
        this.errMessage = errMessage;
    }
}

4.全局异常拦截

package com.xuecheng.base.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
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.ResponseStatus;

/**
 * @author YCL
 * @version 1.0
 * @description TODO
 * @date 2023-01-31 20:56
 */

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(XueChengPlusException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(XueChengPlusException e){
        log.error("系统异常 {}",e.getErrMsg(),e);
        return new RestErrorResponse(e.getErrMsg());
    }

    @ResponseBody
    @ExceptionHandler(Exception.class) //来表明方法的处理异常类型。
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//用状态代码和应返回的原因标记方法或异常类
    public RestErrorResponse exception(Exception e){
        log.error("系统异常 {}",e.getMessage(),e);
        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
    }

}

一些问题:

        系统处理异常的方法:

        自定义一个异常处理器去处理并捕获异常,使用控制器增强器@ControllerAdvice和异常处理注解@ExceptionHandler来处理

        1)处理自定义异常:

                程序在编写的时候根据校验结果自动的抛出自定义的异常类(主动行为),比如收费课程的价格设置为0,这种可预期的错误.异常处理器捕获异常并返回日志给相应用户.

        2)处理未知异常:

                在执行接口的过程中一些运行时异常也会由程序捕获,一路异常日志,统一相应给用户500错误,这样能更加友好,在异常处理的过程中还可以针对某个异常类型单独处理

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值