前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >SpringBoot全局异常处理

SpringBoot全局异常处理

作者头像
用户3467126
发布2019-08-16 15:41:05
发布2019-08-16 15:41:05
80800
代码可运行
举报
文章被收录于专栏:爱编码爱编码
运行总次数:0
代码可运行

前言

估计大家都会了的^_^,本文代码为主,在做Web应用的时候,请求处理过程中发生错误是非常常见的情况,那我们如何才能统一且友好地返回系统异常给前台呢。

关键在于:注解@ControllerAdvice和@ExceptionHandler

开始

通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型

创建一个最简单Springboot项目

Controller层代码:

代码语言:javascript
代码运行次数:0
复制
@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 访问路径 http://localhost:8080/user/finduserByTel?tel=1234567
     * @param tel 手机号
     * @return userName
     */
    @ResponseBody
    @RequestMapping("/finduserByTel")
    public Result findUserNameByTel(@RequestParam("tel") String tel) throws Exception {
        return userService.findUserName(tel);
    }
}

Service层代码:

代码语言:javascript
代码运行次数:0
复制
@Service
public class UserServiceImpl implements UserService {

    @Override
    public Result findUserName(String tel) throws Exception{
        if (StringUtils.isEmpty(tel)) {
            throw new CommonException(ResultEnum.NOT_NULL.getCode(),ResultEnum.NOT_NULL.getMsg());
        }
        if (tel.length() != 11) {
            throw new CommonException(ResultEnum.PARAMS_INVALID.getCode(),ResultEnum.PARAMS_INVALID.getMsg());
        }
        System.out.println("tel:" + tel);
        return ResultUtil.success(tel);
    }
}

统一结果返回工具类

代码语言:javascript
代码运行次数:0
复制
public class ResultUtil {

    public static Result success(Object object){
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setData(object);
        return result;
    }

    public static Result success(){
        return success(null);
    }

    public static Result error(Integer code,String msg){
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }


}

统一结果返回枚举类

代码语言:javascript
代码运行次数:0
复制
public enum ResultEnum {

    //未知错误
    UNKNOW_ERROR(500,"未知错误"),
    SUCCESS(200,"成功"),
    PARAMS_INVALID(405,"参数非法"),
    NOT_NULL(406,"参数不能为空");

    private  Integer code;
    private String msg;

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

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

以上代码很简单,不解析,你一眼就能看懂,就是你平时写得最多的。

关键

自定义通用异常类为了定位的错误更准确,希望不同的错误可以返回不同的错误码,所以可以自定义一个Exception

代码语言:javascript
代码运行次数:0
复制
/**
 * 注意要继承自RuntimeException,底层RuntimeException继承了Exception,
 * spring框架只对抛出的异常是RuntimeException才会进行事务回滚,
 * 如果是抛出的是Exception,是不会进行事物回滚的
 */
public class CommonException extends RuntimeException {


    private Integer code;

    public CommonException(Integer code,String message) {
        //父类的构造方法本身会传message进去
        super(message);
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

}

创建全局异常处理类

通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型

代码语言:javascript
代码运行次数:0
复制
@ControllerAdvice
public class ExceptionHandle {

    /**
     *  @ExceptionHandler(value = Exception.class):声明要捕获的异常类
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e){
        if(e instanceof CommonException){
            CommonException commonException = (CommonException)e;
            return ResultUtil.error(commonException.getCode(),commonException.getMessage());
        }else {
            return ResultUtil.error(ResultEnum.UNKNOW_ERROR.getCode(),ResultEnum.UNKNOW_ERROR.getMsg());
        }
    }
}

最后,启动该应用,访问:

http://localhost:8080/user/finduserByTel?tel=12345678910

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 开始
  • 关键
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档