Springboot 异常处理

https://wx2.sinaimg.cn/mw690/006qgMX1ly1ggbmh00c2vj31hc0u0hdt.jpg

·········································································································································岂曰无衣,与子同袍


本篇介绍SpringBoot框架中异常处理过程。(前后端分离)
使用的项目 : https://github.com/caohongchuan/sdurunner


1.异常处理

1.定义异常处理类

  • 使用@ControllerAdvice 注解类,表明该类为异常处理类
  • 使用@ExceptionHandler 注解方法,表明特定的异常处理方法
//注解异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Result resultError(){
        Result result = new Result(CommonEnum.SERVERERROR);
        return result;
    }

    @ExceptionHandler(RunnerException.class)
    @ResponseBody
    public Result runnerError(RunnerException re){
        Result result = new Result(re.getCode(), re.getErrormsg());
        return result;
    }
}

SpringBoot中有使用@ControllerAdvice的类,即表明了开启全局异常处理,抛出的异常会通过该类进行处理。在该类中需要设置@ExceptionHandler()对不同类型的异常进行特定处理。

2. 自定义异常类

定义接口类:

  • 获取错误码
  • 获取错误信息
public interface BaseErrorInfoInterface {
    /**
     * Wrong code
     * @return wrong code
     */
    int getCode();

    /**
     * error message
     * @return error message
     */
    String getErrormsg();
}

定义错误枚举类

package com.caohongchuan.sdurunner.exception;

public enum CommonEnum implements BaseErrorInfoInterface  {

    SUCCESS(200, "sucess!"),

    USEREXITED(301, "user exited"),
    PASSWORDERROR(302, "password error"),
    USERUNEXITED(303, "user unexited"),

    USERUPDATEERROR(310, "user update error"),
    USERREGISTERERROR(311, "user insert error"),

    ATTENTIONERROR(320, "attention error"),
    CANCELATTENTIONERROR(321, "cancel attention error"),
    GETFANERROR(322, "get fan error"),
    GETFOCUSERROR(323, "get focus error"),
    GETFRIENDRANKERROR(324, "get friend rank error"),

    INSERTPOSTERROR(330, "insert post error"),
    GETPOSTERROR(331, "get post error"),
    UPDATEPOSTERROR(332, "update post error"),
    GETFRIENDPOSTERROR(333, "get friend post error"),
    GETRANDOMPOSTERROR(334, "get random post error"),

    ADDCOMMITERROR(340, "ad dcommit error"),
    DELETECOMMITERROR(341, "delete commit error"),
    ADDLIKEERROR(342, "add like error"),
    DELETELIKEERROR(343, "delete like error"),
    GETCOMMITERROR(344, "get commit error"),
    GETLIKEERROR(345, "get like error"),

    CANTCHANGEPOST(400, "can't change other post"),

    SERVERERROR(500, "server error");


    private int code;
    private String errormsg;

    CommonEnum(int code, String errormsg) {
        this.code = code;
        this.errormsg = errormsg;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getErrormsg() {
        return errormsg;
    }


}

3. 在业务处理层抛出异常

举个例子 获取关注列表

以下代码在service层的UserService类中

public fanResult getFollow(String nickname){
        Integer uid = userMapper.getUserId(nickname);
        //用户不存在,抛出用户不存在异常
        if(uid == null){
            throw new RunnerException(CommonEnum.USERUNEXITED);
        }

        ArrayList<userRank> nameList;

        try {
            ArrayList<Integer> idList = userMapper.getFollowId(uid);
            nameList = new ArrayList<>(idList.size());

            for (int i = 0; i < idList.size(); i++) {
                int uidF = idList.get(i);
                String username = userMapper.getUserName(uidF);
                String profilepic = userMapper.getUserProfilepic(uidF);
                long rundistance = userMapper.getRunDistance(uidF);
                nameList.add(i, new userRank(uidF, username, rundistance, profilepic));
            }
        }catch (Exception exception){
        	//获取FOLLOW过程产生任何异常,抛出获取FOLLOW异常
            throw new RunnerException(CommonEnum.GETFOCUSERROR);
        }

        return new fanResult(CommonEnum.SUCCESS, nameList);
    }

此处抛出的异常会被GlobalExceptionHandler类捕获,并传入相应的函数进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值