1. 程式人生 > >springboot---異常類處理

springboot---異常類處理

異常類處理

在寫程式碼的時候,難免遇見異常類處理的時候,這個時候,在處理自己的業務異常的時候,需要自己封裝一個異常類,用來捕獲業務異常,當然程式碼異常就是錯誤了,需要進行修改程式碼了,要是業務異常有可能因為使用者操作等問題,比如登入的時候,出現的使用者名稱密碼錯誤等問題,需要提示使用者。

1、建立一個異常類,需要繼承RuntimeException這個異常類,用來處理業務異常,我設定了,code碼,errMsg錯誤提示,data返回資料,這三個屬性,用來處理業務異常,之後為了方便,我特意使用了列舉這種方式用來記錄一些code碼和errMsg錯誤提示。

package cn.springboot.yzpt.exception;

import cn.springboot.yzpt.common.CodeEnums;

public class YzptException extends RuntimeException {
    //序列化
    private static final long serialVersionUID = -3076697639889780533L;


    private Integer code;
    private String errMsg;
    private Object data;
    public YzptException(Integer code, String errMsg, Object data) {
        super(errMsg);
        this.code = code;
        this.errMsg = errMsg;
        this.data = data;
    }
    public YzptException(Integer code, String errMsg) {
        super(errMsg);
        this.code = code;
        this.errMsg = errMsg;
    }
    public YzptException(CodeEnums codeEnums) {
        super(codeEnums.getMsg());
        this.code = codeEnums.getCode();
        this.errMsg = codeEnums.getMsg();
    }

    public Integer getCode() {
        return code;
    }

    public String getErrMsg() {
        return errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

附贈:列舉程式碼

package cn.springboot.yzpt.common;

/**
 * 系統列舉,用於業務異常處理
 */
public enum CodeEnums {
    SUCCESS(10000, "操作成功"),
    SYSTEM_ERR(9999, "系統異常"),
    PARA_ERR(8888, "[引數異常]:"),
    USER_EXIST(10001, "使用者已經註冊"),
    PWD_CHECK_ERR(10002, "重複密碼有誤"),
    USER_NOT_EXIST(10003, "使用者不存在"),
    USER_MANY(10004, "使用者狀態異常,請聯絡管理員"),
    USER_PWD_FAIL(10005, "登入密碼錯誤"),
    USER_TOKEN_FAIL(10006, "鑑權失敗,請重新登入"),
    USER_TOKEN_EMPTY(10007, "獲取鑑權資訊失敗"),
    USER_ROLE_LIMIT(10008, "許可權不足"),

    ;
    CodeEnums(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    private Integer code;
    private String msg;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

2、在server裡面進行異常的捕獲。

package cn.springboot.yzpt.server.iml.loginUser;


import cn.springboot.yzpt.common.CodeEnums;
import cn.springboot.yzpt.exception.YzptException;
import cn.springboot.yzpt.mapper.loginUser.LoginUserMapper;
import cn.springboot.yzpt.server.loginUser.LoginUserServer;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;
import java.util.Map;

@Service
public class LoginUserServerIml implements LoginUserServer {

    @Autowired
    LoginUserMapper loginUserMapper;

    @Override
    public boolean login(String user, String password) {

        if(StringUtils.isBlank(user)||StringUtils.isBlank(password)){
            throw new YzptException(CodeEnums.PARA_ERR);
        }

        List<Map<String,String>> userList = loginUserMapper.queryUserInfoByUser(user);
        if(userList.isEmpty()){
            //表明使用者不存在
            throw new YzptException(CodeEnums.USER_NOT_EXIST);
        }
        if(userList.size()!=1){
            //表明有多個使用者,需要管理員介入
            throw new YzptException(CodeEnums.USER_MANY);
        }
        if(StringUtils.equals(password,userList.get(0).get("pass_word"))){
            //表明登陸成功,新增session,等其他的資訊。
            return true;
        }else{
            //密碼錯誤,需要從新輸入
            throw new YzptException(CodeEnums.USER_PWD_FAIL);
        }
    }

    @Override
    public boolean logOut(String user, String password) {
        return false;
    }

    @Override
    public boolean register(String user, String password) {
        return false;
    }

}

3、在controller裡面進行try{}catch(){}的異常處理,裡面寄存在業務異常處理,也存在系統異常的處理。

package cn.springboot.yzpt.controller.loginUser;

import cn.springboot.yzpt.common.CodeEnums;
import cn.springboot.yzpt.common.EventPublisher;
import cn.springboot.yzpt.common.HttpRequestEntity;
import cn.springboot.yzpt.exception.YzptException;
import cn.springboot.yzpt.server.loginUser.LoginUserServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@RestController
@RequestMapping("/loginUser")
public class LoginUserController {

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

    @Autowired
    LoginUserServer loginUserServer;

    @Autowired
    EventPublisher eventPublisher;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public HttpRequestEntity login(@RequestBody Map<String, String> userInfo, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        HttpRequestEntity httpRequestEntity = new HttpRequestEntity();
        try {
            boolean loginType = loginUserServer.login(userInfo.get("user"), userInfo.get("password"));
            httpServletRequest.getSession().setAttribute("id", "12314434231");
            if (loginType) {
                httpRequestEntity.setMessage("登陸成功");


                eventPublisher.pushlish(httpServletRequest,httpServletResponse);

                logger.info(userInfo.get("user") + "登陸成功");
            }
        } catch (YzptException e) {
            httpRequestEntity.setCode(e.getCode());
            httpRequestEntity.setMessage(e.getErrMsg());
        } catch (Exception e) {
            logger.error("/loginUser/login:出現異常", e);
            httpRequestEntity.setCodeEnums(CodeEnums.SYSTEM_ERR);
        }
        return httpRequestEntity;
    }
}

 總結:到這基本異常類就搞定了,在server裡面進行了異常的捕獲,在controller裡面一定要有try{}catch(){}的語句,這樣程式碼才不會報錯,在這裡面,我用到了列舉,當然也可以使用一個類,定義常量來表示。