Java里如何使用ExceptionHandler统一异常处理_集中处理异常机制解析
技术百科
P粉602998670
发布时间:2025-11-26
浏览: 次 @ExceptionHandler是Spring中用于统一处理异常的核心注解,通常与@RestControllerAdvice结合实现全局异常管理。通过定义具体异常处理方法,如NullPointerException、IllegalArgumentException及自定义BusinessException,可返回标准化响应体并设置HTTP状态码。异常应按从具体到通用的顺序排列,避免掩盖细节,并配合日志记录提升排查效率。该机制提升代码可维护性,但不处理404等非异常场景,需额外配置。合理设计异常分类与响应结构,有助于前后端协作。
在Java开发中,特别是在使用Spring或Spring Boot框架时,@ExceptionHandler 是实现统一异常处理的核心机制之一。它能帮助开发者集中管理异常响应,避免在每个控制器中重复写异常捕获逻辑,提升代码的可维护性和一致性。
什么是@ExceptionHandler
@ExceptionHandler 是Spring MVC提供的注解,用于标注在方法上,表示该方法专门用来处理特定类型的异常。当控制器中抛出匹配的异常时,Spring会自动调用这个方法进行处理。
它通常用在@ControllerAdvice或@RestControllerAdvice类中,实现全局异常拦截。
如何使用@ControllerAdvice集中处理异常
要实现全局异常处理,需要结合@ControllerAdvice 注解。它是一个增强版的@Component,能够被Spring容器扫描,并对所有控制器生效。
以下是一个典型的统一异常处理类示例:
@RestControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(NullPointerException.class) public ResponseEntity
handleNullPointer(NullPointerException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("发生了空指针异常:" + e.getMessage()); } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity handleIllegalArgument(IllegalArgumentException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body("参数不合法:" + e.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity handleGeneralException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("系统发生未知错误:" + e.getMessage()); } }
说明:
- @RestControllerAdvice = @ControllerAdvice + @ResponseBody,自动将返回值转为JSON格式。
- 按异常类型从具体到通用排列,避免通用异常提前捕获。
- 返回ResponseEntity可自定义HTTP状态码和响应体。
自定义业务异常与统一响应结构
实际项目中,建议定义自己的业务异常类,便于区分系统异常和业务逻辑问题。
public class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
然后在全局处理器中添加对应处理逻辑:
@ExceptionHandler(BusinessException.class) public ResponseEntity
这样前端可以依据code字段做统一错误提示处理,提升交互体验。
注意事项与最佳实践
使用@ExceptionHandler时应注意以下几点:
- 异常处理方法的参数可以包括Exception、HttpServletRequest等,Spring会自动注入。
- 优先处理具体的异常类型,再兜底到Exception,防止掩盖细节。
- 不要在异常处理中抛出新的受检异常,否则可能引发容器默认错误页。
- 结合日志记录(如log.error)便于排查问题。
- 对于404等非异常情况,不属于@ExceptionHandler处理范围,需通过其他方式配置。
基本上就这些。合理使用@ExceptionHandler配合@ControllerAdvice,能让Java Web应用的异常处理更清晰、更可控。关键是设计好异常分类和响应格式,做到前后端协作顺畅。不复杂但容易忽略细节。
# 后端
# js
# json
# java
# 排列
# 前端
# 状态码
# 处理器
# spring mvc
# java开发
# spring容器
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中理解指针比较_Golang地址
- c++如何用AFL++进行模糊测试 c++ Fuz
- Win11怎么更改任务栏位置_修改注册表将Win1
- c++的位运算怎么用 与、或、异或、移位操作详解【
- c++中explicit(bool)的用法 c++
- php打包exe后无法写入文件_权限问题解决方法【
- Win11怎么关闭SmartScreen_禁用Wi
- Python网页解析流程_html结构说明【指导】
- c++ nullptr与NULL区别_c++11空
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11怎么设置麦克风权限_允许应用访问Win1
- Windows蓝屏错误0x0000001E怎么修复
- Windows音频驱动无声音原因解析_声卡驱动错误
- Win11怎么关闭粘滞键_彻底禁用Windows
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- 如何使用Golang理解结构体指针方法接收者_Go
- Python迭代器生成器进阶教程_节省内存与懒加载
- windows 10应用商店区域怎么改_windo
- 如何使用Golang template生成文本模板
- 如何在Golang中处理二进制数据_Golang
- Win11怎么关闭自动调节亮度_Windows11
- Win11怎么设置默认输入法 Win11固定中文输
- php嵌入式需要什么环境_搭建php+linux嵌
- C++友元类使用场景_C++类间协作设计方式讲解
- Win10如何更改用户账户控制_Windows10
- 一文教你快速开通网站LOGO图
- 如何使用Golang实现路由分组管理_Golang
- Win11如何暂停系统更新 Win11暂停更新最长
- Windows10如何更改桌面背景_Win10个性
- Go 中实现 Python urllib.quot
- Windows10系统怎么查看硬盘健康_Win10
- Win11怎么更改鼠标指针_Windows 11自
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- Win10怎么设置开机密码_Windows10账户
- c# 在高并发下使用反射发射(Reflection
- 如何将文本文件中的竖排字符串转换为横排字符串
- Windows7如何安装系统镜像_Windows7
- Golang如何避免指针逃逸_Golang逃逸分析
- Win11怎么开启HDR模式_Windows 11
- Windows怎样拦截WPS弹窗广告_Window
- Win11系统占用空间大怎么办 Win11深度瘦身
- php做exe支持多线程吗_并发处理实现方式【详解
- C++中的std::shared_from_thi
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- Win11如何设置自动关机 Win11定时关机命令
- Windows10如何更改盘符名称_Win10重命
- Windows怎样关闭桌面弹窗广告_Windows
- php订单日志怎么按状态筛选_php筛选不同状态订
- 一文详解网站被黑客入侵挂马解决办法

public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ResponseEntity
QQ客服