SSM整合详细教学(中)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SSM整合详细教学(中)

三、异常处理器


问题导入

问题1:项目各个个层级均可能出现异常,异常处理代码书写在哪一层?


1 异常介绍


程序开发过程中不可避免的会遇到异常现象,我们不能让用户看到这样的页面数据


1c7d07b0ce253140744bb4b5e7ace740_d86538f6f5ec50f8b53b9ce683e04bd5.png


出现异常现象的常见位置与常见诱因如下:

框架内部抛出的异常:因使用不合规导致

数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)


2 异常处理器


2.2.1 编写异常处理器


@RestControllerAdvice  //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    //统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        return new Result(666,null);
    }
}


使用异常处理器之后的效果


e9b71bf53bec90194bea457d1f1c02bf_3203d3d13649616b9df1f7893ee13e7a.png


2.2.2 @RestControllerAdvice注解介绍


名称:@RestControllerAdvice


类型:类注解


位置:Rest风格开发的控制器增强类定义上方


作用:为Rest风格开发的控制器类做增强


说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能


2.2.3 @ExceptionHandler注解介绍


名称:@ExceptionHandler

类型:方法注解

位置:专用于异常处理的控制器方法上方

作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行

说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常


四、项目异常处理方案


问题导入

请说出项目当前异常的分类以及对应类型异常该如何处理?


1 项目异常分类


业务异常(BusinessException)

规范的用户行为产生的异常

不规范的用户行为操作产生的异常

系统异常(SystemException)

项目运行过程中可预计且无法避免的异常

其他异常(Exception)

编程人员未预期到的异常


2 项目异常处理方案


业务异常(BusinessException)

发送对应消息传递给用户,提醒规范操作

系统异常(SystemException)

发送固定消息传递给用户,安抚用户

发送特定消息给运维人员,提醒维护

记录日志

其他异常(Exception)

发送固定消息传递给用户,安抚用户

发送特定消息给编程人员,提醒维护(纳入预期范围内)

记录日志


3 项目异常处理代码实现


3.1 根据异常分类自定义异常类


3.1.1 自定义项目系统级异常


//自定义异常处理器,用于封装异常信息,对异常进行分类
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;
    }
}



3.1.2 自定义项目业务级异常


//自定义异常处理器,用于封装异常信息,对异常进行分类
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;
    }
}



3.2 自定义异常编码(持续补充)


public class Code {
  //之前其他状态码省略没写,以下是新补充的状态码,可以根据需要自己补充
    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;
}


3.3 触发自定义异常


@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,"请不要使用你的技术挑战我的耐性!");
        }
    }
}


3.4 在异常通知类中拦截并处理异常


@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }
    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }
    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}


测试:在postman中发送请求访问getById方法,传递参数-1,得到以下结果:


a9f87f2b3719c1e231226b7ee725e952_a336a9b13b211816e63dc75520197060.png


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
前端开发 JavaScript Java
毕业设计论文|基于SSM的网络教学系统设计与实现
毕业设计论文|基于SSM的网络教学系统设计与实现
|
9月前
|
Java 关系型数据库 MySQL
基于SSM的教学管理系统(有报告)。Javaee项目。
基于SSM的教学管理系统(有报告)。Javaee项目。
|
9月前
|
Java 关系型数据库 MySQL
基于SSM的教学课程评价管理系统(有报告)。Javaee项目。
基于SSM的教学课程评价管理系统(有报告)。Javaee项目。
|
2月前
|
小程序 前端开发 测试技术
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的大学多媒体教学管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的大学多媒体教学管理系统附带文章和源代码部署视频讲解等
32 7
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
33 4
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的景海中学教学管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的景海中学教学管理系统附带文章和源代码部署视频讲解等
25 5
|
3月前
|
JavaScript Java 测试技术
基于ssm+vue.js的计算机公共基础课程mooc教学平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的计算机公共基础课程mooc教学平台附带文章和源代码设计说明文档ppt
18 1
|
3月前
|
JavaScript Java 测试技术
基于ssm+vue.js的网络教学平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的网络教学平台附带文章和源代码设计说明文档ppt
31 1
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高校教学业绩信息管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高校教学业绩信息管理系统附带文章和源代码部署视频讲解等
15 0