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

面试题--系统如何处理异常

 1. 回答

在项目中如何处理异常?

:自定义统一异常处理器捕获异常

        我们定义一个统一的异常处理器去捕获并处理异常。使用注解@ControllerAdvice和异常处理注解@WxceptionHandler来实现

  • 处理自定义异常

程序在编写代码时根据校验结果主动抛出自定义一场类对象,指定详细异常信息,并相应给用户

  • 处理未知异常

接口执行过程中的一些运行时异常也会由异常处理器同意捕获,记录异常日志,统一响应给用户

        在异常处理器中还可以针对某个异常类型进行单独处理

2. 流程

步骤如下:

1. 定义一个基础异常类,继承RuntimeException接口,重写方法

package com.sky.exception;/*** 业务异常*/
public class BaseException extends RuntimeException {public BaseException() {}public BaseException(String msg) {super(msg);}}

2. 每一个异常类都继承BaseException类,重写方法

package com.sky.exception;/*** 密码修改失败异常*/
public class PasswordEditFailedException extends BaseException{public PasswordEditFailedException(String msg){super(msg);}}

3. 业务处理

/*** 根据id删除分类* @param id*/public void deleteById(Long id) {//查询当前分类是否关联了菜品,如果关联了就抛出业务异常Integer count = dishMapper.countByCategoryId(id);if(count > 0){//当前分类下有菜品,不能删除throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);}//查询当前分类是否关联了套餐,如果关联了就抛出业务异常count = setmealMapper.countByCategoryId(id);if(count > 0){//当前分类下有菜品,不能删除throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);}//删除分类数据categoryMapper.deleteById(id);}

4. 定义全局异常捕获器

        捕获后端产生的异常信息

package com.sky.handler;import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.sql.SQLIntegrityConstraintViolationException;/*** 全局异常处理器,处理项目中抛出的业务异常*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 捕获业务异常* @param ex* @return*/@ExceptionHandlerpublic Result exceptionHandler(BaseException ex){log.error("异常信息:{}", ex.getMessage());return Result.error(ex.getMessage());}@ExceptionHandlerpublic Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
//        Duplicate entry 'zhangsan' for key 'employee.idx_username'
//        获取异常信息String message = ex.getMessage();
//        截取到username字段,将其封装成提示信息给前端提示用户if (message.contains("Duplicate entry")){
//            将错误信息通过空格截取成数组String[] split = message.split(" ");
//            获取数组的第三个元素 :zhangsanString username = split[2];
//            将username与错误信息拼接成最终的错误信息String msg = username  + MessageConstant.ALREADY_EXIST;
//            响应给前端return Result.error(msg);}else {return Result.error(MessageConstant.UNKNOWN_ERROR);}}}

http://www.xdnf.cn/news/1087903.html

相关文章:

  • SpringAI学习笔记-MCP服务器简单示例
  • 【UE5】虚幻引擎小百科
  • 后台设计指南:系统架构、交互规范与工具实战全流程解析
  • (C++)list列表相关基础用法(C++教程)(STL库基础教程)
  • Android T startingwindow使用总结
  • 深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信
  • 容器技术技术入门与 Docker 环境部署
  • Flutter基础(前端教程④-组件拼接)
  • Python Web应用开发之Flask框架高级应用(三)——蓝图(Blueprints)
  • uniapp b树
  • 【LeetCode 热题 100】142. 环形链表 II——快慢指针
  • FairyGUI 实现 Boss 双层血条动画
  • Crazyflie无人机集群控制笔记(二)通过SDK实时对接Crazyswarm2及NOKOV度量动捕数据
  • jmeter 性能测试步骤是什么?
  • 代码详细注释:C语言实现控制台用户注册登录系统
  • C++进阶—二叉树进阶
  • [2025CVPR]SGC-Net:开放词汇人机交互检测的分层粒度比较网络解析
  • 【网络协议安全】任务14:路由器DHCP_AAA_TELNET配置
  • Redis基础数据结构
  • Serverless 数据库来了?无服务器数据库 vs 传统数据库有何不同?
  • 学习日记-spring-day43-7.8
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(1):新的开始-尊他开始
  • Docker企业级应用:从入门到生产环境最佳实践
  • ReactNative【实战系列教程】我的小红书 4 -- 首页(含顶栏tab切换,横向滚动频道,频道编辑弹窗,瀑布流布局列表等)
  • 论文略读:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning
  • C++(STL源码刨析/vector)
  • PostgreSQL复制技术全解析:从物理复制到逻辑复制的实践指南
  • 从历史航拍图像中去除阴影
  • 把文件夹下所有的excle写入word文件中
  • Grok 4,来了。