前言
Springboot的异常处理,我这里总结一种处理Controller异常的方法。虽然遇到过很多个处理异常的方法,但是总觉得,先把自己能掌握住的方法先掌握住哈,以后再慢慢说。
方法
1、 创建一个专门处理异常的抽象类并在类上加注解@RestControllerAdvice
2、 创建处理类的方法handlerException(Throwable e)
3、 在方法上添加@ExceptionHandler
4、 方法里判断是何类型的异常,根据异常信息处理
5、 让Controller类继承该类,从而达到每个视图层都能处理异常信息
具体使用如下:
package com.example.demo.controller;
import com.example.demo.entity.json.MessageJson;
import com.example.demo.service.exception.PasswordNotExitException;
import com.example.demo.service.exception.RegisterFaildException;
import com.example.demo.service.exception.UserNotFoundException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public abstract class BaseController {
//请求成功返回给客户端的code
public static final int SUCCESS=200;
@ExceptionHandler
public MessageJson handlerException(Throwable e){
//MessageJson是返回给客户端的一个JSON对象,其实是一个普普通通的类
MessageJson messageJson=new MessageJson(e);
//判断e的类型
if(e instanceof PasswordNotExitException){
messageJson.setCode(4001);//4001代表密码不对
}else if(e instanceof UserNotFoundException){
messageJson.setCode(4002);//4002代表用户不存在
}else if(e instanceof RegisterFaildException){
messageJson.setCode(4003);//4003代表添加用户失败
}
//返回JSON对象
return messageJson;
}
}
自定义异常
1、创建个异常包
2、创建自定义类
3、继承RuntimeException
4、重写方法
package com.example.demo.service.exception;
public class UserNotFoundException extends RuntimeException{
public UserNotFoundException() {
super();
}
public UserNotFoundException(String message) {
super(message);
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
}
public UserNotFoundException(Throwable cause) {
super(cause);
}
protected UserNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
修改JSON对象
修改JSON的构造器,以便传输错误信息,具体方法如下:
package com.example.demo.entity.json;
public class MessageJson {
private Integer code;//响应代码
private Object object;//返回给客户端的对象
private String message;//错误信息
public MessageJson() {
}
public MessageJson(Throwable e){//需要修改这一步,目的是为了给message赋值,主要是在处理异常时,将异常传给JSON
this.message=e.getMessage();
}
public MessageJson(Integer code, Object object) {
this.code = code;
this.object = object;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
流程说明
具体的流程大概如下:客户端发送请求到后台,controller中调用service方法,经过逻辑判断,如果发现有自定义异常抛出,那就会直接跳到异常处理方法handlerException中,然后创建JSON对象,将异常信息传给JSON的message属性,组后返回给前台,然后前台再根据返回的message和code来判断是什么异常。