统一异常处理机制:
1、使用SpringMVC提供的统一异常拦截器(BasicExceptionAdvice)
package cn.leyou.common.exception;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @Author: swq
* @Date: 2019/8/28 16:00
* 统一异常处理
*/
@ControllerAdvice
public class BasicExceptionAdvice {
//创建处理运行时异常信息的方法
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleException(RuntimeException e) {
return ResponseEntity.status(500).body(e.getMessage());
}
//创建处理LyException异常信息的方法
@ExceptionHandler(LyException.class)
public ResponseEntity<ExceptionResult> handleLyException(LyException e) {
return ResponseEntity.status(e.getStatus()).body(new ExceptionResult(e.getStatus(),e.getMessage()));
}
}
-
@ControllerAdvice:默认情况下,会拦截所有加了@Controller的类[外链图片转存失败(img-Kb6LBiQh-1566990546385)(F:/%E9%BB%91%E9%A9%AC102/JY/%E9%A1%B9%E7%9B%AE%E4%BA%8C/day01/%E7%AC%94%E8%AE%B0/assets/1534203615380.png)]
-
@ExceptionHandler(RuntimeException.class):作用在方法上,声明要处理的异常类型,可以有多个,这里指定的是RuntimeException。被声明的方法可以看做是一个SpringMVC的Handler:- 参数是要处理的异常,类型必须要匹配
- 返回结果可以是
ModelAndView、ResponseEntity等,基本与handler类似
2、自定义异常(LyExceptionEnums)
package cn.leyou.common.exception;
import cn.leyou.common.enums.LyExceptionEnums;
import lombok.Data;
/**
* @Author: swq
* @Date: 2019/8/28 16:22
*/
@Data
public class LyException extends RuntimeException {
//定义状态码
private Integer status;
public LyException(LyExceptionEnums enums) {
super(enums.getMessage());
this.status = enums.getStatus();
}
public LyException(LyExceptionEnums enums, Throwable cause) {
super(enums.getMessage(), cause);
this.status = enums.getStatus();
}
}
3、controller层
package cn.leyou.controller;
import cn.leyou.common.enums.LyExceptionEnums;
import cn.leyou.common.exception.LyException;
import cn.leyou.pojo.Item;
import cn.leyou.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: swq
* @Date: 2019/8/27 19:22
*/
@RestController
public class ItemServiceController {
@Autowired
private ItemService itemService;
@RequestMapping("/test")
public ResponseEntity<Item> saveItem(Item item) {
if (item.getPrice() == null) {
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
throw new LyException(LyExceptionEnums.PRICE_CANNOT_BE_NULL);
}
return ResponseEntity.ok(itemService.saveItem(item));
}
}
4、异常返回结果(ExceptionResult)( 以状态码 异常信息 时间戳的方式返回)
package cn.leyou.common.exception;
import lombok.Data;
import org.joda.time.DateTime;
/**
* @Author: swq
* @Date: 2019/8/28 17:36
*/
@Data
public class ExceptionResult {
private Integer status;
private String message;
private String timestamp;
public ExceptionResult(Integer status, String message) {
this.status = status;
this.message = message;
this.timestamp = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
}
}
5、定义枚举信息(LyExceptionEnums)(目的统一异常信息显示)
package cn.leyou.common.enums;
import lombok.Getter;
/**
* @Author: swq
* @Date: 2019/8/28 16:19
*/
@Getter
public enum LyExceptionEnums {
PRICE_CANNOT_BE_NULL(400, "价格不能为空!"),
INVALID_FILE_TYPE(400, "无效的文件类型!"),
INVALID_PARAM_ERROR(400, "无效的请求参数!"),
INVALID_PHONE_NUMBER(400, "无效的手机号码"),
INVALID_VERIFY_CODE(400, "验证码错误!"),
INVALID_USERNAME_PASSWORD(400, "无效的用户名和密码!"),
INVALID_SERVER_ID_SECRET(400, "无效的服务id和密钥!"),
INVALID_NOTIFY_PARAM(400, "回调参数有误!"),
INVALID_NOTIFY_SIGN(400, "回调签名有误!"),
CATEGORY_NOT_FOUND(404, "商品分类不存在!"),
BRAND_NOT_FOUND(404, "品牌不存在!"),
SPEC_NOT_FOUND(404, "规格不存在!"),
GOODS_NOT_FOUND(404, "商品不存在!"),
CARTS_NOT_FOUND(404, "购物车不存在!"),
APPLICATION_NOT_FOUND(404, "应用不存在!"),
ORDER_NOT_FOUND(404, "订单不存在!"),
ORDER_DETAIL_NOT_FOUND(404, "订单数据不存在!"),
DATA_TRANSFER_ERROR(500, "数据转换异常!"),
INSERT_OPERATION_FAIL(500, "新增操作失败!"),
UPDATE_OPERATION_FAIL(500, "更新操作失败!"),
DELETE_OPERATION_FAIL(500, "删除操作失败!"),
FILE_UPLOAD_ERROR(500, "文件上传失败!"),
DIRECTORY_WRITER_ERROR(500, "目录写入失败!"),
FILE_WRITER_ERROR(500, "文件写入失败!"),
SEND_MESSAGE_ERROR(500, "短信发送失败!"),
INVALID_ORDER_STATUS(500, "订单状态不正确!"),
UNAUTHORIZED(401, "登录失效或未登录!");
private int status;
private String message;
LyExceptionEnums(int status, String message) {
this.status = status;
this.message = message;
}
}
总结:在controller层处理异常信息,把异常信息抛给自定义异常类,经过BasicExceptionAdvice拦截,经过处理后返回包含时间戳、状态码、异常信息的异常返回结果(ExceptionResult)对象
本文介绍了一种基于SpringMVC的统一异常处理机制,通过自定义异常类LyException和全局异常处理类BasicExceptionAdvice,实现对运行时异常和自定义异常的统一捕获与处理,返回包含状态码、异常信息及时间戳的ExceptionResult对象。
2939

被折叠的 条评论
为什么被折叠?



