目录 异常处理器 项目异常处理方案 项目异常处理代码实现 根据异常分类自定义异常类 自定义异常编码(持续补充) 触发自定义异常 异常处理器 程序开发过程中不可避免的会遇到异
目录
- 异常处理器
- 项目异常处理方案
- 项目异常处理代码实现
- 根据异常分类自定义异常类
- 自定义异常编码(持续补充)
- 触发自定义异常
异常处理器
程序开发过程中不可避免的会遇到异常现象
出现异常现象的常见位置与常见诱因如下:
- 框架内部抛出的异常:因使用不合规导致
- 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
- 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
- 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
- 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
所有的异常均抛出到表现层进行处理
表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,使用AOP思想统一处理
编写异常处理器、集中的、统一的处理项目中出现的异常
@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器 public class ProjectExceptionAdvice { //统一处理所有的Exception异常 @ExceptionHandler(Exception.class) public Result doOtherException(Exception ex){ return new Result(500,null,"系统异常"); } }
使用异常处理器之后的效果
@RestControllerAdvice注解介绍
- 名称:@RestControllerAdvice
- 类型:==类注解==
- 位置:Rest风格开发的控制器增强类定义上方
- 作用:为Rest风格开发的控制器类做增强
- 说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能
@ExceptionHandler注解介绍
- 名称:@ExceptionHandler
- 类型:==方法注解==
- 位置:专用于异常处理的控制器方法上方
- 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
- 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常
项目异常处理方案
项目异常分类
业务异常(BusinessException)
- 规范的用户行为产生的异常
- 不规范的用户行为操作产生的异常
系统异常(SystemException)
- 项目运行过程中可预计且无法避免的异常
其他异常(Exception)
- 编程人员未预期到的异常
项目异常处理方案
- 业务异常(BusinessException)
- 发送对应消息传递给用户,提醒规范操作
系统异常(SystemException)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给运维人员,提醒维护
- 记录日志
其他异常(Exception)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给编程人员,提醒维护(纳入预期范围内)
- 记录日志
项目异常处理代码实现
根据异常分类自定义异常类
自定义项目系统级异常
//自定义异常处理器,用于封装异常信息,对异常进行分类 public class SystemException extends RuntimeException{ private Integer code; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = 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 class BusinessException extends RuntimeException{ private Integer code; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = 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 class Code { //状态码 public static final Integer SAVE_OK = 20011; public static final Integer DELETE_OK = 20021; public static final Integer UPDATE_OK = 20031; public static final Integer GET_OK = 20041; public static final Integer SAVE_ERR = 20010; public static final Integer DELETE_ERR = 20020; public static final Integer UPDATE_ERR = 20030; public static final Integer GET_ERR = 20040; public static final Integer SYSTEM_ERR = 50001; public static final Integer SYSTEM_TIMEOUT_ERR = 50002; public static final Integer SYSTEM_UNKNOW_ERR = 59999; public static final Integer BUSINESS_ERR = 60002; }
触发自定义异常
@Service public class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; //在getById演示触发异常,其他方法省略没有写进来 public Book getById(Integer id) { //模拟业务异常,包装成自定义异常 if(id <0){ throw new BusinessException(Code.BUSINESS_ERR,"项目业务级异常!"); } } }