原創: 猿份哥
原文鏈接:http://www.lskyf.com/view/9
爲什麼要全局統一異常處理呢?
如果系統發生了異常,不做統一異常處理,前端會給用戶展示一大片看不懂的文字。做統一異常處理後當異常發生後可以給用戶一個溫馨的提示,不至於使用戶滿頭霧水,所以一方面是爲了更好的用戶體驗 如果不統一全局異常,服務端和前端在遇到異常的時候處理起來雜亂無章非常費力。所以另一方面是爲了制定規範提高工作效率
SpringBoot如何實現全局統一異常處理呢?
項目目錄結構
自定義異常類
pom.xml加入lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
MyException.java
@Getter
@Setter
public class MyException extends RuntimeException {
private Integer code;
public MyException(String msg){
super(msg);
}
public MyException(Integer code,String msg){
super(msg);
this.code=code;
}
}
自定義枚舉類
public enum ResultEnum {
SUCCESS(200,"成功"),
FAIL(100,"失敗"),
EXCEPTION(300,"系統異常"),
UNLOGIN(201,"未登錄");
private Integer code;
private String msg;
private ResultEnum(Integer code,String msg){
this.code=code;
this.msg=msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
自定義全局異常捕獲類
@ControllerAdvice
public class MyExceptionAdvice {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result defaultException(HttpServletRequest request,Exception e){
e.printStackTrace();
return Result.builder()
.code(ResultEnum.EXCEPTION.getCode())
.message(ResultEnum.EXCEPTION.getMsg())
.build();
}
@ExceptionHandler(value = MyException.class)
@ResponseBody
public Result myException(HttpServletRequest request,MyException e){
e.printStackTrace();
Integer code=e.getCode();
String message=e.getMessage();
if (e.getCode()==null){
code=ResultEnum.EXCEPTION.getCode();
}
if (e.getMessage()==null){
message=ResultEnum.EXCEPTION.getMsg();
}
return Result.builder()
.code(code)
.message(message)
.build();
}
}
進行測試
@RestController
public class ExceptionController {
@RequestMapping("/exception")
public Result exception(String name,String pwd) throws Exception {
String realname="tiankonglanlande";
String realPwd="123";
if(null!=name&&name.equals("xx")){
throw new Exception("系統異常!");
}
if(StringUtils.isEmpty(name)||StringUtils.isEmpty(pwd)){
throw new MyException("參數必須傳!");
}else if (!name.equals(realname)||!pwd.equals(realPwd)){
throw new MyException("用戶名或密碼不正確!");
}else if (name.equals("aa")){
throw new MyException(200,"用戶名存在!");
}
String info="你好["+name+"]!";
return ResultUtils.success(info);
}
@RequestMapping("/unlogin")
public Result unlogin() throws Exception {
return ResultUtils.success(ResultEnum.UNLOGIN);
}
@RequestMapping("/success")
public Result success() throws Exception {
return ResultUtils.success(200,"自定義消息");
}
}
運行測試在瀏覽器訪問
可以看到瀏覽器返回對應的json字符
源碼地址:
https://github.com/tiankonglanlande/springboot
作 者:猿份哥
網址導航:http://www.lskyf.com
個人博客:http://www.lskyf.xyz
版權所有,歡迎保留原文鏈接進行轉載:) 關注我們的公衆號瞭解更多