springboot---異常類處理
阿新 • • 發佈:2018-11-27
異常類處理
在寫程式碼的時候,難免遇見異常類處理的時候,這個時候,在處理自己的業務異常的時候,需要自己封裝一個異常類,用來捕獲業務異常,當然程式碼異常就是錯誤了,需要進行修改程式碼了,要是業務異常有可能因為使用者操作等問題,比如登入的時候,出現的使用者名稱密碼錯誤等問題,需要提示使用者。
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(){}的語句,這樣程式碼才不會報錯,在這裡面,我用到了列舉,當然也可以使用一個類,定義常量來表示。