在 Spring MVC 应用中,异常处理的机制有哪些?请说明不同方式的使用场景和差异。
考察说明
考察对 Spring MVC 异常处理机制的理解及实际应用能力。
回答思路
- 【回答框架 1】Spring MVC 异常处理主要基于 HandlerExceptionResolver 接口,它负责在控制器方法抛出异常时解析并返回对应的响应。常见的内置实现有 DefaultHandlerExceptionResolver、ExceptionHandlerExceptionResolver 和 ResponseStatusExceptionResolver 等。
- 【回答框架 2】最常用的方式是通过 @ExceptionHandler 注解在 @ControllerAdvice 类或单个控制器中定义异常处理方法。@ControllerAdvice 用于全局配置,可定义多个异常处理方法,根据异常类型分发到不同方法,实现统一处理。
- 【回答框架 3】也可以实现 HandlerExceptionResolver 接口自定义解析器,或者继承 SimpleMappingExceptionResolver 来映射异常到视图。Java 8 以后可以在异常类上加 @ResponseStatus 注解,指定响应码和原因,由 ResponseStatusExceptionResolver 处理。
- 【回答框架 4】不同方式的适用场景:@ExceptionHandler 适合业务异常,返回 JSON;ResponseStatusExceptionResolver 适合状态码映射;HandlerExceptionResolver 灵活性最高,可做复杂逻辑。建议结合使用,使用 @ControllerAdvice 处理业务异常,其余兜底。
- 【关键点 1】核心机制是 HandlerExceptionResolver,多种实现提供不同处理方式。
- 【关键点 2】@ExceptionHandler 配合 @ControllerAdvice 实现全局异常处理。
- 【关键点 3】ResponseStatusExceptionResolver 处理 @ResponseStatus 注解的异常。
- 【关键点 4】自定义 HandlerExceptionResolver 提供最高灵活性。
- 【关键点 5】异常处理应区分业务异常和系统异常,避免向用户暴露内部细节。
- 【易错点 1】@ExceptionHandler 方法参数类型不匹配时可能不生效,需检查异常类型。
- 【易错点 2】多个异常处理器同时存在时,优先级容易混淆,需要了解解析器顺序。
- 【易错点 3】自定义异常处理中返回视图可能忽略异步请求,需区分同步与异步处理。