异常处理器我们的程序可能或者说必然会出现一些漏洞,有些可能是人为的,有些可能是我们代码的问题
所以为了处理这些异常,首先我们需要把异常出现的常见位置与原因进行分类:
- 框架内部抛出的异常:因使用不合规导致
- 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
- 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
- 表现层抛出的异常:因数据收集,校验等规则导致(例如:不匹配的数据类型间导致异常)
- 工具类抛出的异常:因工具类书写不严谨不够健全导致(例如:必要释放的连接长期未释放)
- 在上述我们可以看到各个层级都会出现问题,那么我们的异常处理器应该写在哪一层?
- 所有的异常均向上抛出至表现层进行处理
- 表现层处理异常,每个方法单独书写,代码书写量巨大且意义不大,该怎么处理?
- 采用AOP思想
前面我们说过需要在表现层统一处理异常,所以我们选择在表现层书写异常处理器:
package com.itheima.controller;import com.itheima.exception.BusinessException;import com.itheima.exception.SystemException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;//@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器@RestControllerAdvicepublic class ProjectExceptionAdvice { // @ExceptionHandler用于设置当前处理器类对应的异常类型 // 这里处理的是Exception.class,属于最大的异常处理 @ExceptionHandler(Exception.class) public Result doOtherException(Exception ex){ // Code.SYSTEM_UNKNOW_ERR是在Code状态码文件中统一设置的,null是返回值,后面属于附加内容用于安抚用户 return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!"); }}/*名称:@RestControllerAdvice类型:类注解位置:Rest风格开发的控制器增强类定义上方作用:为Rest风格开发的控制器类做增强说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能名称:@ExceptionHandler类型:方法注解位置:专用于异常处理的控制器方法上方作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器操作,并转入该方法进行执行说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常*/编写项目异常处理我们的项目异常处理通常不会直接对最大异常处理
因为我们的项目通常会出现很多种类型的异常,例如用户操作错误产生的异常,编程人员未预期到的异常
我们进行一个简单的分类:
- 业务异常(BusinessException)
- 规范的用户行为产生的异常
- 不规范的用户行为操作产生的异常
- 系统异常(SystemException)