springboot统一处理异常和自定义异常

在我们做web系统的时候,难免会出现各种各样的异常,但是这种异常,不能直接显示在客户端,所以我们服务端就需要做统一处理,统一返回格式给客户端

这里用到了spring的两个注解:@ControllerAdvice---控制器增强和@ExceptionHandler ---异常处理

下面来看看具体的实现,建立一个类,加上@ControllerAdvice注解


/**
 * 统一异常处理类
 */
@ControllerAdvice
public class MyExceptionHandler {

    private static Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);

    /**
     * 参数解析失败异常处理
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    public ResponseResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":参数解析失败",e);
        return new ResponseResult(HttpStatus.BAD_REQUEST.value(),"参数解析失败");
    }

    /**
     * 不支持当前请求方法异常处理
     */
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public ResponseResult handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":不支持当前请求方法",e);
        return new ResponseResult(HttpStatus.METHOD_NOT_ALLOWED.value(),"不支持当前请求方法");
    }


    /**
     * 项目运行异常处理
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult handleException(Exception e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":服务运行异常",e);
        return new ResponseResult(HttpStatus.INTERNAL_SERVER_ERROR.value(),"服务运行异常");

    }


    /**
     * 自定义异常处理
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MyException.class)
    @ResponseBody
    public ResponseResult handleException(MyException e, HttpServletRequest request) {
        logger.error(request.getRequestURI() + ":自定义内部异常",e.getMsg());
        return new ResponseResult(e.getCode(),e.getMsg());

    }
}

这里只是举例经常遇到的几个异常,具体的项目运行异常还可以细分,如空指针、类型转换异常、IO异常等

最后一个就是自定义异常处理

@Data
public class MyException extends RuntimeException{

    //错误吗
    private Integer code;

    //错误信息
    private String msg;

    public MyException(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    

}

下面来检验一下,统一处理异常是否生效

1.检验请求类型,我们用get请求方式去测试

2.检验服务器运行异常,我们故意在代码中写个异常来测试(应该抛出java.lang.ArithmeticException: / by zero)

3.检验自定义异常

总结:测试得出,异常都可以统一处理了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值