当前位置: 首页 > article >正文

SpringMvc项目异常处理方案

项目异常处理方案

问题导入

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

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,得到以下结果:


http://www.kler.cn/news/290775.html

相关文章:

  • 计算机领域学术会议(ICCBD+AI 2024)
  • 缓存和数据库缓存有什么区别
  • VISION TRANSFORMER ADAPTER FORDENSE PREDICTIONS
  • 页面小组件-表格封装(基础版)
  • idea新建父工程和添加导入新模块的步骤
  • Gin 验证器详解与案例分析
  • 代码随想录第50天|图论
  • 【并行计算】CUDA基础
  • 行为型设计模式-命令(command)模式-python实现
  • C++判断语句(基础速通)ac-wing
  • OpenAI发布GPT-4o mini,3.5从此退出历史舞台?
  • 10.9 网络安全概述
  • watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [swapper/0:1]
  • 微信小程序跳转到另一个微信小程序
  • 2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
  • 替代 Django 默认 User 模型并使用 `django-mysql` 添加数据库备注20240904
  • 国内PFMEA的实施困境与价值探讨
  • 天气预报爬虫
  • kali——wpscan的使用
  • Mac工程动态库配置和加载探究
  • 【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking
  • RabbitMQ 03 在项目中的实际使用
  • Azure OpenAI Ingesion Job API returns 404 Resource not found
  • 【图论入门】图的存储
  • 【编程底层思考】什么是JVM对象内存分配的空间分配担保,咋担保的?
  • [环境配置]Pycharm手动安装汉化插件
  • Redis缓存预热方案详解:提升应用性能与用户体验
  • ActiViz实战:使用Actor2D画一个二维网格
  • Unity | 内存优化之资源冗余问题
  • python办公自动化:使用`Python-PPTX` 应用动画效果