一、引言
我们在做后端开发的时候,程序可能会出现各种运行时异常,当用户请求接口之后,会将异常赤裸裸地展示在页面上,使得用户体验极差,那么一个集中的处理异常的类就显得尤为重要。集中处理异常可以使代码容易维护,减少代码的冗余。
二、处理异常步骤
- 创建一个Result类,用于封装返回的数据
public class Result {
/**
* 请求是否成功
*/
private Boolean flag;
/**
* 响应状态码
*/
private Integer code;
/**
* 提示信息
*/
private String message;
/**
* 返回数据
*/
private Object data;
//getter setter
}
- 创建一个BaseExceptionHandler类,用于处理异常
@ControllerAdvice
public class BaseExceptionHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handler(Exception e){
logger.error(e.getMessage(),e);
return new Result(false, 500,"服务器内部错误");
}
}
此时如果接口出现异常,则会返回友好的提示语。
三、扩展
有时候由于业务的需要,我们需要自定义异常,当抛出自定义异常后,就执行某些操作。
- 先创建一个自定义异常类,继承RuntimeException,直接继承父类的构造方法
public class ServiceException extends RuntimeException{
public ServiceException() {
}
public ServiceException(String message) {
super(message);
}
}
- 在原有的异常处理类上针对这一异常作处理
@ControllerAdvice
public class BaseExceptionHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handler(Exception e){
if(e instanceof ServiceException){
//处理的业务逻辑
return new Result(false,400,e.getMessage());
}
logger.error(e.getMessage(),e);
return new Result(false, 500,"服务器内部错误");
}
}