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.检验自定义异常

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章