目录
3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)
一、介绍
1.异常
在程序开发过程当中不可避免遇到异常现象。系统中的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由springMVC前端控制器交由异常处理器进行异常处理。
通俗理解:就是一层一层往上抛直到抛给前端控制器调用异常处理器处理
2.出现异常现象的常见位置和常见诱因如下
(1)框架内部抛出的异常:因使用不合规导致
(2)数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
(3)业务层抛出的异常:因业务逻辑书写错误导致(遍历业务书写操作,导致索引异常等)
(4)表现层抛出的异常:因数据收集、校验等规矩导致(例如:不匹配的数据类型间导致异常)
(5)工具类抛出的异常:因工具栏书写不严谨健壮导致(例如:必要释放的连接长期未释放等)
3.异常的分类
(1)业务异常(BusinessException)
规范的用户行为产生异常,不规范的用户行为操作产生的异常
解决办法:发送对应的消息传递给用户,提醒规范操作
(2)系统异常(SystemException)
项目运行过程中可预计且无法避免的异常
解决办法:发送固定消息给用户,安抚用户(例如,您的网络不通畅,请稍后再试)。还有发送特定的消息给运维人员,提醒维护。记录日志
(3)其他异常(Exception)
编程人员没有预测到的异常。
解决办法:发送固定的消息给用户,安抚用户,发送特定的消息给编程人员,提醒维护。记录日志
4.异常的注解
(1)@restcontrolleradvice
这个注解是异常注解,放在类上面,代表这个类统一处理异常,是rest开头的,代表处理rest风格的异常,基于AOP思想,所以又含有advice,通常配合@ExceptionHandler使用,这个异常代表指定要拦截哪些异常。
位置:Rest风格开发的控制器增强类定义上方
作用:为Rest风格开发的控制器类做增强(此注解自带ResponseBody注解和Component注解,具备对应的功能)
(2)@ExceptionHandler
这个注解是拦截指定异常的,通常写在方法的上面。告诉这个方法里面要拦截哪些异常。与@restcontrolleradvice搭配使用比较多
位置:专用于异常处理的控制器方法上方
作用:设置异常指定的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前的方法执行。
5.异常怎么处理?
在各个层级出现了异常要分别处理很麻烦,就统一放到最上层的表现层去统一处理就好了 。要用AOP的思想去处理。
(1)使用Spring MVC提供的简单异常处理器SimapleMappingExceptionResolver
(2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器(推荐)
二、出现异常的解决例子
总结:
1.在一个类里面进行自定义异常种类编号
//1:自定义项目系统级异常
public class SystemException extends RuntimeException{
private Integer code;
public SystemException( Integer code, String message){
super(message);
this.code = code;
}
public SystemException( Integer code,String message,Throwable cause){
super(message, cause);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
//2:自定义项目业务级异常
public class BusinessException extends RuntimeException{
private Integer code;
public BusinessException( Integer code, string message){
super(message);
this.code = code;
}
public BusinessException(Integer code,String message,Throwable cause) {
super(message,cause);
this.code = code;
}
public Integer getcode() {
return code;
}
public void setCode (Integer code) {
this.code = code;
}
}
//3.自定义异常编号
public class code {
public static final Integer SYSTEM_UNKNOW_ERROR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERROR =50002;
public static final Integer PROJECT_VAL IDATE_ERROR = 60001;
public static final Integer PROJECT_BUSINESS_ERROR = 60002;
}
2.在可能会出现异常的地方标记这些编号(触发自定义异常)
//4.标记可能会出现异常的地方
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public Book getById(Integer id){
if( id<0 ){
throw new BusinessException(Code.PROECT_BUSINESS_ERROR , "请勿进行非法操作! ");
}
return bookDao.getById(id);
}
}
3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)
//5:拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler (BusinessException.class)
public Result doBusinessException(BusinessException ex){
return new Result(ex.getCode() , null,ex.getMessage());
}
@ExceptionHandler (SystemException.class)
public Result doSystemException(SystemException ex){
/记录日志(错误堆栈)
//发送邮件给开发人员
//发送短信给运维人员
return new Result(ex.getCode() ,null,ex.getMessage());
}
@ExceptionHandler(Exception.class)
public Result doException(Exception ex){
/记录日志(错误堆栈)
//发送邮件给开发人员
//发送短信给运维人员
return new Result(Code.SYSTEM_UNKNOW_ERROR , null, "系统繁忙,请联系管理员!");
}
}
4.处理结果展示
{
"data" : null,
"code" : 60002,
"msg":"请勿进行非法操作!”
}
有什么问题都可以评论区留言,看见都会回复的
如果你觉得本篇文章对你有所帮助的,多多支持吧!!!
点赞收藏评论,抱拳了!