出现异常现象的常见位置与常见诱因如下:
框架内部抛出异常:因使用不和规则导致
数据层抛出异常:因外部服务器故障导致(例如:服务器访问超时)
业务层抛出异常:因业务逻辑书写错误导致(遍历业务书写操作,导致索引异常等)
表现层抛出异常:因数据收集,校验等股则导致(不匹配的数据类型间导致异常)
工具类抛出异常:因工具类书写不够严谨不够健壮导致(必要释放的连接长期未释放)
各个层均抛出异常,异常处理代码书写在哪一层?
所有的异常均抛出到表现层进行统一处理。
表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决——AOP思想
项目异常分类
业务异常(BusinessException)
1. 规范的用户行为产生的异常
不规范的用户行为操作产生的异常
*发送对应的消息传递给用户,提醒规范操作
系统异常(SystemException)
项目运行过程中可预计且无法避免的异常
*发送固定的消息传递给用户,安抚用户
*发送特定消息给运维人员,提醒维护
*记录日志
其它异常(Exception)
编程人未预期到的异常
**发送固定的消息传递给用户,安抚用户
*发送特定消息给编程人员,提醒维护(纳入预期范围)
*记录日志
SystemException
package com.yang.exception; public class SystemException extends RuntimeException{ private Integer code; public SystemException(Integer code, String message, Throwable cause) { super(message, cause); this.code = code; } public SystemException(Integer code, String message) { super(message); this.code = code; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
BusinessException
package com.yang.exception; public class BusinessException extends RuntimeException{ private Integer code; public BusinessException(Integer code, String message, Throwable cause) { super(message, cause); this.code = code; } public BusinessException(Integer code, String message) { super(message); this.code = code; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
service【造的异常】
@Override public Book select(Integer id) { //模拟自定义异常 if (id == 1) { throw new BusinessException(Code.PROJECT_BUSINESS_ERROR,"请勿进行非法操作!!"); } try{ id= 1/0; }catch (SystemException ex){ throw new SystemException(Code.SYSTEM_TIMEOUT_ERROR,"系统繁忙,请稍后重试!!"); } return bookDao.select(id); }
Controller :ProjectExceptionAdvice
package com.yang.controller; import com.yang.exception.BusinessException; import com.yang.exception.SystemException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler(BusinessException.class) public Result doBusinessException(BusinessException be ){ //发送对应的消息给用户 return new Result(null,be.getCode(),be.getMessage()); } @ExceptionHandler(SystemException.class) public Result doSystemException(SystemException se ){ //发送特定消息给用户 //发送特定消息给运维人员,提醒维护 //记录日志 return new Result(null,se.getCode(),se.getMessage()); } @ExceptionHandler(Exception.class) public Result doException(Exception ex ){ //发送特定消息给用户 //发送特定消息给编程人员,提醒维护 //记录日志 return new Result(null,Code.SYSTEM_UNKNOWN_ERROR,"系统繁忙,请联系管理员"); } }
Code
package com.yang.controller; public class Code { public static final Integer SYSTEM_UNKNOWN_ERROR = 50001; public static final Integer SYSTEM_TIMEOUT_ERROR = 50002; public static final Integer PROJECT_VALIDATE_ERROR = 60001; public static final Integer PROJECT_BUSINESS_ERROR = 60002; }