自定义异常
因为某些业务需要进行业务回滚。但spring的事务只针对RuntimeException的进行回滚操作。所以需要回滚就要继承RuntimeException。
public class MyException extends RuntimeException {
//异常错误码
private int code;
//异常信息
private String msg;
//异常构造方法 在使用时方便传入错误码和信息
public MyException(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
捕获异常
使用@ControllerAdvice
注解,配合@ExceptionHandler
使用
例如:@ExceptionHandler(Exception.class) 用来捕获@requestMapping的方法中所有抛出的exception。
@ControllerAdvice
public class DefultExceptionHandler {
//声明要捕获的异常
@ExceptionHandler(Exception.class)
public String ExcepitonHandler(HttpServletRequest request,Exception e) {
return “error”;
}
}
捕获异常后的具体操作,写上合适的逻辑
例如:
1.创建了一个SellException类放入Exception包中
public class SellException extends RuntimeException {
private Integer code;
public SellException(ResultEnum resultEnum) {
super(resultEnum.getMessage());
this.code = resultEnum.getCode();
}
}
2.因为异常有很多类型,所以我们建立一个枚举类ResultEnum
在这个枚举类中放入所有的能使用的异常然后进行调用,枚举类可以访问数据但是不能修改,所以我们使用@Getter标签
@Getter
public enum ResultEnum {
PARAM_ERROR(1,"参数不正确"),
PRODUCT_NOT_EXIST(10,"商品不存在"),
PRODUCT_STOCK_ERROR(11,"商品库存不正确"),
ORDER_NOT_EXIST(12,"订单不存在"),
;
private Integer code;
private String message;
ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
3. 捕获异常
先抛出
throw new SellException();
捕获
@ControllerAdvice
public class SellException {
/**
* 拦截登录异常,并跳转到登录界面
* value = SellException .class)表示拦截的异常为SellException 异常
*/
@ExceptionHandler(value = SellException.class)
public ModelAndView handlerAuthorize(){
return new ModelAndView("redirect:"+"/sell/seller/toLogin");
}
}