SSM整合-异常处理器及项目异常处理方案

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SSM整合-异常处理器及项目异常处理方案

一、异常处理器

程序开发过程中不可避免的会遇到异常现象


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


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

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

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

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

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


1、各个层级出现异常,异常处理代码书写在哪一层?


所有的异常均抛出到表现层进行处理


2、表现层处理异常,每个方法单独书写,代码书写量巨大且意义不强,如何解决?


AOP思想


异常处理器


集中的、统一的处理项目中出现的异常

@RestControllerAdvice
public class ProjectExceptionAdvice{
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        return new Result(666,null);
    }
}


名称:@RestControllerAdvice

类型:类注解

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

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

范例:

@RestControllerAdvice
public class ProjectExceptionAdvice{
}

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


名称:@ExceptionHandler

类型:方法注解

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

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

范例:

@RestControllerAdvice
public class ProjectExceptionAdvice{
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        return new Result(666,null);
    }
}

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


异常处理器处理效果比对:


无异常时:

5771ee884de9407dbbcdc405f57a4be8.png

有异常时:

6bb15ec5fd4c44e8b689e86b4ca5e101.png

二、项目异常处理方案

项目异常分类

业务异常(BusinessException)

b7f2ffb8f646478a8e213ce7d4c4e472.png

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

5c5e1924cce14845bd81cb353b78d61a.png

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


系统异常(SystemException)



3efb7bde164d4d618512f7b7cdcb6eb2.png


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


其他异常(Exception)

2f7b28d3a8f84c0f818b0f38dc802202.png

编程人员未预期到的异常

项目异常处理方案

业务异常(BusinessException)


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


系统异常(SystemException)

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

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

记录日志


其他异常(Exception)

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

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

记录日志

项目异常处理

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;
    }
}

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、自定义异常编码(持续补充)

public class Code {
    public static final Integer SYSTEM_UNKNOW_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;
}

4、触发自定义异常

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    public Book getById(Integer id) {
        //模拟业务异常,包装成自定义异常
        if(id < 0){
            throw new BusinessException(Code.PROJECT_BUSINESS_ERROR,"请勿进行非法操作!");
        }
        return bookDao.getById(id);
    }
}

5、拦截并处理异常

//@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
@RestControllerAdvice
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_ERROR,null,"系统繁忙,请联系管理员!");
    }
}

6、异常处理器效果对比

dd7271dda6a04d66836ee18611653584.png

5ac69b0b04304f7bbedcb1b60db295a3.png


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
9月前
|
缓存 Java 程序员
【C++】一文全解C++中的异常:标准库异常体系&自定义异常体系(含代码演示)
【C++】一文全解C++中的异常:标准库异常体系&自定义异常体系(含代码演示)
|
前端开发 Java 开发者
|
XML 存储 前端开发
SpringMVC(四、异常处理和综合练习)
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后 者主要通过规范代码开发、测试等手段减少运行时异常的发生。
SpringMVC(四、异常处理和综合练习)
|
6月前
|
Java API 开发者
【开发者福音】Spring Boot 异常处理:优雅应对错误,提升应用健壮性,让调试不再是噩梦!
【8月更文挑战第29天】本文通过对比传统错误处理方式与Spring Boot推荐的最佳实践,展示了如何在Spring Boot应用中实现统一且优雅的异常处理。传统方法需在每个可能出错的地方显式处理异常,导致代码冗余且不一致。而Spring Boot的全局异常处理机制则能集中处理所有异常,简化代码并确保错误响应格式统一,提高应用程序的健壮性和可维护性。文中提供了具体的示例代码以帮助读者更好地理解和应用这一机制。
177 0
|
9月前
|
JSON 前端开发 Java
优化用户体验:SpringBoot统一异常处理最佳实践
优化用户体验:SpringBoot统一异常处理最佳实践
136 0
|
前端开发 Java
SpringBoot代码整洁之道系列之一:全局异常处理
整洁代码不仅包括实际项目中的业务代码,也包括一些系统级别的。全局异常处理属于系统级的整洁代码。如果我们把我们的项目比做成一座城市,那么类似全局异常处理、拦截器等等就相当于这座城市的排水系统、电缆布置等等。这些设施布置的好坏直接影响整个城市的运转情况。那么在项目层级来说,系统级的整洁代码就是为了使得项目可以更加高效的运转。
|
9月前
|
搜索推荐 PHP 开发者
PHP编程中的异常处理与最佳实践
异常处理在PHP编程中扮演着至关重要的角色,它不仅能够提高程序的稳定性和可靠性,还能使开发者更好地理解和调试代码。本文将深入探讨PHP中的异常处理机制,并介绍一些最佳实践,帮助读者更好地理解和运用异常处理技术。
|
6月前
|
消息中间件 测试技术
项目环境测试问题之规范执行器的异常处理如何解决
项目环境测试问题之规范执行器的异常处理如何解决

热门文章

最新文章