0

0

在Java中如何统一处理应用层异常_Java全局异常处理设计说明

P粉602998670

P粉602998670

发布时间:2026-02-12 17:50:58

|

404人浏览过

|

来源于php中文网

原创

@controlleradvice是spring boot中统一捕获controller层异常的最有效方式,需配合@exceptionhandler使用,按业务分组定义、限定basepackages范围,返回responseentity,且不处理filter/interceptor等mvc外异常。

在java中如何统一处理应用层异常_java全局异常处理设计说明

Spring Boot中用@ControllerAdvice捕获所有Controller异常

绝大多数Web应用的业务异常都发生在Controller层或其调用链中,@ControllerAdvice是最直接有效的统一拦截点。它能覆盖所有@RestController@Controller类抛出的未被捕获异常,包括RuntimeException及其子类、受检异常(如果没在方法签名中声明)。

  • 必须配合@ExceptionHandler使用,每个方法指定处理一类异常,例如@ExceptionHandler(NullPointerException.class)
  • 推荐按业务分组定义多个@ControllerAdvice类(如ValidationAdviceBusinessExceptionAdvice),避免单个类膨胀
  • 注意@ControllerAdvice默认作用于所有包,可通过basePackages限定扫描范围,防止误拦截第三方库异常
  • 返回值建议用ResponseEntity<result></result>而非StringModelAndView,便于统一状态码和JSON结构

区分@ResponseStatus和@ExceptionHandler的适用场景

@ResponseStatus只适合简单、无逻辑分支的异常映射,比如404、401这类标准HTTP状态码;而@ExceptionHandler支持完整Java方法体,可记录日志、调用服务、动态构造响应体。

  • @ResponseStatus(code = HttpStatus.NOT_FOUND)只能加在异常类上(如自定义ResourceNotFoundException),无法做条件判断或补充字段
  • @ExceptionHandler方法内可调用log.error("ID={} not found", id, e),也可根据环境决定是否返回堆栈信息
  • 两者不互斥:可为异常类标注@ResponseStatus作兜底,再用@ExceptionHandler覆盖特定逻辑
  • 若同时存在,@ExceptionHandler优先级更高,@ResponseStatus会被忽略

全局异常处理器必须避开Filter和Interceptor中的异常

@ControllerAdvice只拦截进入DispatcherServlet之后的异常,Filter、Interceptor、Servlet容器层(如400 Bad Request)、跨域预检失败等都不在其范围内。

Quickchat AI
Quickchat AI

Quickchat AI能够帮助企业构建自己的多语言AI助手

下载
  • Filter中抛出的异常会直接触发容器默认错误页(如Tomcat的Whitelabel Error Page),需在web.xmlErrorPageRegistrar中注册/error路径接管
  • Interceptor的preHandle异常不会被@ControllerAdvice捕获,应在内部try-catch并转为ResponseEntity返回
  • JSON解析失败(如字段类型不匹配)触发的是HttpMessageNotReadableException,属于Spring MVC异常体系,可被@ExceptionHandler捕获,但需确保该异常未被更早的HandlerExceptionResolver吞掉

自定义异常基类要重写fillInStackTrace()提升性能

频繁抛出异常时,Throwable.fillInStackTrace()是主要开销来源,尤其在日志记录或监控埋点密集的场景下。业务异常通常不需要完整堆栈,跳过它能降低30%+异常构造耗时。

立即学习Java免费学习笔记(深入)”;

  • 继承RuntimeException后,在构造函数中显式调用super(null),再重写fillInStackTrace()返回this
  • 仅对明确不需排查调用链的异常(如ParamInvalidExceptionAuthFailedException)做此优化
  • 保留堆栈的异常(如ServiceUnavailableException)仍应调用父类fillInStackTrace()
  • 注意:IDE调试时可能看不到堆栈,需依赖日志中的cause或主动打印e.getStackTrace()
实际项目中最容易被忽略的是异常传播边界——不是所有“抛出来”的异常都会走到@ControllerAdvice,得先确认它真正在MVC流程里。比如CompletableFuture异步回调里的异常、ScheduledTask中的异常、甚至MyBatis的SQLException包装链,都可能绕过常规拦截路径。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

168

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

154

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

237

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

166

2024.02.23

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

4

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号