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

Spring Boot2错误处理

一、错误处理底层组件分析

Spring Boot 2 错误处理的核心组件包括:

  1. ErrorMvcAutoConfiguration
    自动配置类,初始化错误处理基础设施
  2. BasicErrorController
    处理/error请求的默认控制器,根据请求类型返回JSON或错误视图
  3. DefaultErrorAttributes
    收集错误信息(状态码、异常、时间戳等)
  4. ErrorPageCustomizer
    注册错误页面(如404重定向到/error
  5. DefaultErrorViewResolver
    解析错误视图模板(如error/404.html
二、异常处理流程分析
graph TD
A[请求进入DispatcherServlet] --> B[执行Controller]
B --> C{是否抛出异常?}
C -->|是| D[遍历HandlerExceptionResolver]
C -->|否| E[正常响应]
D --> F{找到匹配解析器?}
F -->|是| G[解析器处理异常]
F -->|否| H[异常传递到Servlet容器]
H --> I[ErrorPageCustomizer重定向到/error]
I --> J[BasicErrorController处理]
J --> K[返回错误响应]

三、全局异常处理(@ControllerAdvice)
@ControllerAdvice
public class GlobalExceptionHandler {// 处理特定异常@ExceptionHandler(CustomException.class)public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {ErrorResponse response = new ErrorResponse(ex.getCode(), ex.getMessage());return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);}// 处理所有未捕获异常@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {ErrorResponse response = new ErrorResponse("GLOBAL_001", "系统异常");return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);}
}

四、自定义异常实现
// 业务异常基类
public abstract class BusinessException extends RuntimeException {private final String errorCode;public BusinessException(String errorCode, String message) {super(message);this.errorCode = errorCode;}public String getErrorCode() {return errorCode;}
}// 具体业务异常
public class OrderNotFoundException extends BusinessException {public OrderNotFoundException(Long orderId) {super("ORDER_404", "订单不存在: " + orderId);}
}// 使用示例
@GetMapping("/orders/{id}")
public Order getOrder(@PathVariable Long id) {return orderRepository.findById(id).orElseThrow(() -> new OrderNotFoundException(id));
}

五、自定义异常处理解释器分析

通过实现HandlerExceptionResolver接口深度定制:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE) // 最高优先级
public class CustomExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {// 1. 识别异常类型if (ex instanceof BusinessException) {BusinessException bex = (BusinessException) ex;// 2. 构建统一响应体ErrorResult result = new ErrorResult(bex.getErrorCode(),bex.getMessage(),Instant.now());// 3. 设置HTTP状态码response.setStatus(HttpStatus.BAD_REQUEST.value());// 4. 返回JSON响应try {response.getWriter().write(new ObjectMapper().writeValueAsString(result));return new ModelAndView(); // 返回空视图表示已处理} catch (IOException e) {return null; // 继续其他解析器处理}}return null; // 其他异常由后续解析器处理}
}

关键机制对比
处理方式适用场景执行优先级
@ExceptionHandler控制器内局部异常处理最高
@ControllerAdvice全局异常处理
HandlerExceptionResolver底层定制化处理
BasicErrorController默认错误端点最低

最佳实践建议

  1. 业务异常使用自定义异常体系
  2. 全局处理使用@ControllerAdvice覆盖常见异常
  3. 通过HandlerExceptionResolver处理特殊协议响应
  4. application.yml中配置:
    server:error:include-exception: true   # 响应中包含异常信息include-stacktrace: never # 生产环境关闭堆栈
    

http://www.lryc.cn/news/601245.html

相关文章:

  • Android网络框架封装 ---> Retrofit + OkHttp + 协程 + LiveData + 断点续传 + 多线程下载 + 进度框交互
  • 【AI阅读】20250717阅读输入
  • Linux YUM 安装:高效管理软件包的利器
  • 白杨SEO:搜索引擎优化中的allintitle是什么指令?有哪些用处?
  • 8. 状态模式
  • 【最新版】防伪溯源一体化管理系统+uniapp前端+搭建教程
  • ACL原理和配置
  • 【element-ui】HTML引入本地文件出现font找不到/fonts/element-icons.woff
  • 【lucene】MMapDirectory 在FSDirectory基础上干了啥?
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情分析实现
  • AI驱动的金融推理:Fin-R1模型如何重塑行业决策逻辑
  • listen() 函数详解
  • GPGPU基本概念
  • 深入解析 Vue 3 中 v-model 与表单元素的绑定机制
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十一天-模拟面试第一次
  • 五自由度磁悬浮轴承转子不平衡振动破壁战:全息前馈控制实战密码
  • 结构化文本文档的内容抽取与版本重构策略
  • 程序代码篇---python获取http界面上按钮或者数据输入
  • LeetCode 611.有效三角形的个数
  • 机器学习项目一基于KNN算法的手写数字识别
  • 设计模式(十二)结构型:享元模式详解
  • AI Coding IDE 介绍:Cursor 的入门指南
  • 设计模式(八)结构型:桥接模式详解
  • 以太坊ETF流入量超越比特币 XBIT分析买币市场动态与最新价格
  • 分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测
  • 机器学习—线性回归
  • 数学基础薄弱者的大数据技术学习路径指南
  • Java Ai (day01)
  • Oracle EBS 库存期间关闭状态“已关闭未汇总”处理
  • 【网络协议安全】任务15:DHCP与FTP服务全配置