SpringBoot web项目中使用@ExceptionHandler处理全局异常?或是使用HandlerExceptionResolver?哪种更合适

springboot webflux 异常处理(WebExceptionHandler) springbootwebflux异常处理(WebExceptionHandler) 阅读详情

在Spring Boot项目中,使用@ExceptionHandler(结合@ControllerAdvice)和HandlerExceptionResolver两种方式处理全局异常各有适用场景,需根据具体需求权衡。

以下从技术原理、优缺点、适用场景三方面对比分析:

1. @ExceptionHandler + @ControllerAdvice

技术原理
  • @ExceptionHandler:标注在方法上,用于捕获Controller中抛出的指定异常类型,返回自定义响应(如JSON)。
  • @ControllerAdvice:全局异常处理器注解,可将多个@ExceptionHandler方法集中到一个类中,作用于所有Controller。
优点
  • 配置简单:通过注解即可实现,无需复杂接口实现。
  • 精准控制:可针对不同异常类型(如NullPointerException、CustomException)编写不同处理逻辑,返回结构化错误信息(如HTTP状态码、错误码、消息)。
  • 与Spring MVC深度集成:天然支持Spring的响应式编程模型(如返回ResponseEntity),适合RESTful API场景。
  • 代码可读性高:异常处理方法与业务逻辑分离,符合单一职责原则。
缺点
  • 仅处理Controller层异常:无法捕获Service层或其他非Controller层抛出的异常(需配合AOP或其他机制)。
  • 优先级问题:若多个@ControllerAdvice存在,需通过@Order注解指定优先级,否则可能因加载顺序导致意外覆盖。

2. HandlerExceptionResolver

技术原理
  • 接口定义:Spring MVC提供的异常解析接口,需实现resolveException方法,自定义异常处理逻辑。
  • 执行顺序:在DispatcherServlet处理请求过程中,若Controller抛出异常,会先尝试@ExceptionHandler,未处理则调用HandlerExceptionResolver。
优点
  • 全局拦截:可捕获整个应用上下文(包括Service层、DAO层)的异常,覆盖范围更广。
  • 灵活控制:可实现复杂逻辑(如日志记录、邮件通知、重试机制),甚至根据异常类型跳转不同视图(如JSP页面)或返回不同响应。
  • 与Spring MVC流程深度集成:可获取请求、响应、模型等对象,进行更底层的操作。
缺点
  • 配置复杂:需手动实现接口,编写较多样板代码。
  • 维护成本高:逻辑分散在多个实现类中,可读性较差。
  • 与@ExceptionHandler优先级冲突:若同时存在,@ExceptionHandler优先处理,可能导致HandlerExceptionResolver逻辑不生效。

3. 对比总结与选择建议

对比维度@ExceptionHandler + @ControllerAdviceHandlerExceptionResolver
适用场景RESTful API、结构化错误响应、Controller层异常全局异常拦截、复杂处理逻辑、非Controller层异常
配置复杂度低(注解驱动)高(需实现接口)
扩展性中(通过继承/组合扩展)高(可完全自定义逻辑)
与Spring集成度高(天然支持响应式模型)中(需手动处理响应)
代码可维护性高(逻辑集中,可读性强)低(逻辑分散,需理解Spring MVC流程)
选择建议
  • 优先使用@ExceptionHandler + @ControllerAdvice:
    适用于大多数Spring Boot项目,尤其是RESTful API场景。它简单、直观,能满足Controller层异常处理需求,且与Spring的响应式编程模型无缝集成。例如:

    /**
     * 全局异常处理器,用于捕获和处理应用程序中的自定义异常。
     */
    @ControllerAdvice
    public class GlobalExceptionHandler {
        /**
         * 处理CustomException类型的异常,返回标准化的错误响应。
         * @param e 捕获的自定义异常
         * @return 包含错误码和错误信息的响应实体
         */
        @ExceptionHandler(CustomException.class)
        public ResponseEntity<ErrorResponse> handleCustomException(CustomException e) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                    .body(new ErrorResponse(e.getErrorCode(), e.getMessage()));
        }
    }
     
    

  • 选择HandlerExceptionResolver的场景:

    • 需要捕获Service层、DAO层等非Controller层的异常。
    • 需要实现复杂逻辑(如异常重试、多通道通知、动态路由到不同视图)。
    • 项目已存在基于HandlerExceptionResolver的遗留代码,需保持兼容性。

4. 最佳实践:混合使用

Spring Boot支持混合使用两种方式,优先级为:@ExceptionHandler > HandlerExceptionResolver。

  • 推荐方案:
    • 使用@ControllerAdvice处理Controller层常见异常(如参数校验、业务异常)。
    • 通过HandlerExceptionResolver捕获全局未处理的异常(如系统级错误),并记录日志、发送告警等。
      示例:
public class CustomExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, 
                                        HttpServletResponse response, 
                                        Object handler, 
                                        Exception ex) {
        // 处理未被@ExceptionHandler捕获的异常(如数据库连接失败)
        log.error("Global exception: ", ex);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return new ModelAndView("error");
    }
}

结论:在Spring Boot项目中,@ExceptionHandler + @ControllerAdvice是更优的选择,因其简单、高效、与Spring MVC深度集成。仅在需要全局拦截或复杂逻辑时,才考虑补充HandlerExceptionResolver。

实战指南:基于ELK与Grafana构建天融信防火墙日志可视化看板 本文详细介绍了如何基于ELK与Grafana构建天融信防火墙日志可视化看板,包括环境准备、日志收集与解析配置、Elasticsearch存储优化、Grafana看板设计等关键步骤。通过实战案例和优化技巧,帮助用户高效处理天融信防火墙日志,实现安全态势的可视化监控与分析。 阅读详情

相关推荐

新手避坑:RT-Thread-Studio外设驱动配置最容易忽略的3个地方(附WDT实例)

本文针对RT-Thread-Studio新手在配置外设驱动时常见的编译报错问题,以看门狗(WDT)为例,详细解析了最易忽略的三个关键配置环节:RT-Thread-Studio的图形化Setting开关、Kconfig中的依赖关系以及SConscript的编译规则。掌握这三层配置模型,能有效避免头文件包含正确却依然编译失败的问题,确保驱动代码被正确加入构建。

gray5的博客 506

WebExceptionHandler详解

是 Spring Framework 中的一个接口,它用于处理 Web 应用程序中的异常。具体来说,主要用于处理在处理 HTTP 请求时可能发生的异常,并返回适当的响应给客户端。在 Spring 框架中,是 Spring Web 模块的一部分,通常与 Spring Web MVC 或 Spring WebFlux 结合使用。这个接口在处理异常时提供了一种扩展的方式,以便应用程序可以自定义异常处理逻辑。以下是一些关于允许您定义全局的异常处理逻辑,无需在每个控制器方法中处理异常。

m0_51663233的博客 1673

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 667

深入学习ErrorWebExceptionHandler

通过深入探究WebExceptionHandler的源码,从根本上了解如何自定义异常处理的handler

技术专栏 4119

MATLAB双目相机标定:从工具箱实战到参数精解

本文详细讲解了使用MATLAB进行双目相机标定的完整实战流程与参数精解。从拍摄合格的棋盘格图像、设置关键参数(如径向畸变系数),到分析重投影误差、优化结果并正确导出和使用内外参,提供了从操作到原理的全面指导,帮助读者为立体视觉应用奠定精准基础。

weixin_29041767的博客 259

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5983

异常处理:ExceptionHandlerExceptionResolver类

index.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>首页</title> </head&gt...

方法属性类,一个都不会 6820

android+音乐节拍检测,科学网—音乐节拍跟踪或音乐节拍检测软件,LilyBeats alpha - 石自强的博文...

我们设计并实现了一种用于实时跟踪音乐节拍的软件。该软件可以用于智能灯方案提供商,为其提供灯光随音乐变化的核心解决方案。首先给出软件的下载链接:或者音乐节拍是乐曲中表示固定单位时值和强弱规律的组织形式,亦称拍子。它有两个特性:周期性和连续性。节拍周期性表现为节拍结构,是乐曲中周期性出现的节奏序列。节拍连续性表现为音乐的平均速度,其单位为bpm(beat per minute每分钟音乐节拍的个数)。音...

weixin_39571403的博客 1401

Spring Web : 注解@ExceptionHandler的工作原理

我们知道,Spring Web注解@ExceptionHandler可以用来指定处理某类异常的控制器方法,从而在这些异常发生时,会有相应的控制器方法来处理此类异常,其定义方式如下 : /** * 此方法定义一个异常处理器,仅仅处理异常 DemoException , 它使用一个视图对象 * DemoExceptionHandlerView 来处理异常 * ...

Details Inside Spring 4707

STM32F407通过FSMC接口与LAN9252的EtherCAT从站移植实战

本文详细介绍了在STM32F407平台上,通过FSMC接口驱动LAN9252 EtherCAT从站控制器的完整移植实战。内容涵盖硬件连接、FSMC时序配置、官方SDK代码分析与关键修改、EtherCAT协议栈集成适配,以及实战调试与稳定性优化技巧,旨在帮助工程师解决工业通信中的核心挑战,实现稳定高效的实时控制网络接入。

weixin_29268267的博客 274

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

SpringBoot 全局异常处理用法及原理

SpringMVC ExceptionHandler原理 Exception在哪里被处理? protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; boolean m

weixin_42468128的博客 3621

ESP32-S3驱动OV3660摄像头原理图设计,已量产

本文重点拆四条主线:多来源输入电源如何收敛到 3V3,摄像头三路供电如何拆分,ESP32-S3 如何接住 DVP 数据流与外部存储,以及音频/补光/传感外围怎样挂到主控边上。至于最终图像帧率、算法策略和软件时序,当前原理图未体现。

不脱发的程序猿 982

SpringBoot全局异常处理的三种方式

在本文中,我们介绍了 SpringBoot 中三种处理异常的方式,分别是使用@ControllerAdvice 注解、@ExceptionHandler 注解和 HandlerExceptionResolver 接口。这些方式各有优缺点,开发者可以根据自己的需求选择适合自己的方式来处理异常。作者:吾日三省吾码来源:优快云原文:https://blog.youkuaiyun.com/Dc253061007/article/details/131100724。

Admans的专栏 829

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

优雅的处理 SpringBoot 全局异常

先赞后看,养成习惯 ???? 欢迎微信关注[Java编程之道],每天进步一点点,沉淀技术分享知识。 Spring Boot中Web应用的统一异常处理 大家在日常开发中常常遇到系统爆出各种不友好的异常,导致整个系统交互体验极差甚至是系统崩溃,今天我们就聊一下SpringBoot中如果开发一个统一的异常处理中心。 这部分内容比较基础,只是很多同学很少去设计或者参与到需要全局异常处理的开发中来…以下介绍几种常用的处理方式。 友好的异常处理方式 SpringBoot默认的已经提供了一套处理异常的机制。一旦程

LeoByte的编程驿站 2412

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot全局异常处理的5种实现方式

在实际开发中,异常处理是一个非常重要的环节。合理的异常处理机制不仅能提高系统的健壮性,还能大大提升用户体验。本文将详细介绍SpringBoot中全局异常处理的几种实现方式。Spring Boot提供了BasicErrorController来处理应用中的错误,我们可以通过继承或替换它来自定义错误处理逻辑。String message = "未知错误";case 404:message = "请求的资源不存在";break;

风象南的专栏 1385

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

springboot的异常处理-设置全局异常处理

一.说明 1.1 全局异常设置 通过注解@ControllerAdvice 定义一个处理全局 异常的类,在需要捕捉异常的方法上加上@ExceptionHandler(value=Exception.class)这个注解。 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody 如下图 二 案例操作 2.1 执行逻辑 配置一个检测异常的全局类,发生异常时,根据配置的code,msg,url等信息,以j

健康平安的活着的专栏 2181

SpringBoot第四章: 处理全局异常

我们在springmvc中有讲过处理全局异常,当然,springboot也是有全局异常处理的。 一. 自定义 处理常见的404和 505 页面。 例如,我们输入了一个程序中不存在的路径,那么会跳转到404找不到的界面。 输入:http://localhost:8080/j/show1 其实,springboot中还自带有自定义处理404.html和500.html异常。 只需要在resources/templates目录下放入error.html就可以进行页面自定义跳转, 但前提是需...

逼哥很疯狂的博客 744

Spring Boot系列十 Spring MVC全局异常处理总结

1. 概述SpringMVC 提供的异常处理主要有两种方式: 一种是直接实现自己的HandlerExceptionResolver 一种是使用注解 通过注解的方式实现处理异常主要有以下两种方式: 1 @ControllerAdvice+@ExceptionHandler:配置对全局异常进行处理 2 @Controller + @ExceptionHandler:配置对当前所在Controller的异

不积跬步无以至千里; 不积小流无以成江海 9041

java web 全局异常_详解Spring Boot2 Webflux的全局异常处理

本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflux的全局异常处理机制。SpringMVC的异常处理Spring 统一异常处理有 3 种方式,分别为:使用 @ExceptionHandler 注解实现 HandlerExceptionResolver 接口使用 @controlleradvice 注解使用 @Exception...

weixin_32933155的博客 610

Spring Boot全局异常处理

Spring Boot全局捕获异常,包括Controller中的异常和Filter中的异常。

qq_47993287的博客 747

创建全局异常处理器(Global Exception Processor)

在Java程序中,异常(Exception)是指在程序执行过程中发生的非正常情况,它打断了正常的指令流;Java中的异常处理是一种用于处理程序中错误和异常情况的一种机制。

Yi_An_Jie的博客 3077

8. springBoot-web开发——异常处理

1.SpringBoot默认的错误处理机制 一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理; 2. 定制错误响应页面 2.1 有模板引擎 即有thymeleaf的时候。 2.1.1 精确匹配 将错误页面命名为 错误状态码.html 放在模板引擎文件夹(templates)下的error文件夹下,发生此状态码的...

武汉小喽啰 883

SpringBoot 异常处理机制

SpringBoot异常处理机制的使用总结。

TheAnnoyingDog的博客 2539

springboot中的异常处理

springboot中异常处理的几种方式

注定风是不羁旅人 1999
上一篇: <? extends T>是什么,<? super T>又是什么,PECS是指什么
下一篇: Java中的Thread、ThreadLocalMap、ThreadLocal三者之间的关系,ThreadLocalMap.Entry的弱引用设计
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值