Java如何统一处理异常_Java全局异常处理机制搭建指南
技术百科
P粉602998670
发布时间:2025-12-08
浏览: 次 Java统一异常处理核心是@ControllerAdvice配合@ExceptionHandler,结合统一响应格式Result和分级日志记录,实现异常拦截、分类处理与友好返回。
Java中统一处理异常的核心是用@ControllerAdvice配合@ExceptionHandler,再结合统一响应格式和日志记录,让所有控制器的运行时异常都能被拦截、分类、友好返回,避免堆栈暴露给前端。
定义全局异常处理器类
新建一个类,加上@ControllerAdvice注解,它会自动作用于所有@Controller(包括@RestController):
- 类上加@ControllerAdvice,可指定包路径(如basePackages = "com.example.controller")缩小生效范围
- 方法上用@ExceptionHandler声明能捕获的异常类型,支持多个异常类,如@ExceptionHandler({NullPointerException.class, IllegalArgumentException.class})
- 方法参数可直接写异常对象、HttpServletRequest、HttpServletResponse等,Spring会自动注入
设计统一响应结构
避免每个接口返回Map或Object,建议封装一个标准响应体,比如:
-
Result
:含code(如200成功、500系统异常、400参数错误)、msg(提示语)、data(业务数据) - 异常处理器里不再return new ModelAndView,而是return Result.fail("操作失败", e.getMessage())
- 前端统一判断code,无需解析不同字段,也便于后续做国际化或错误码映射
分层捕获与日志记录
不是所有异常都该被全局处理器“吞掉”,要区分场景:
- 业务异常(如UserNotExistException)——建议自定义异常并主动throw,由@ExceptionHandler精准捕获,返回400或特定code
- 系统异常(如NullPointerException、SQLException)——兜底捕获Exception,记录ERROR日志(含堆栈),返回500 + 友好提示(如“服务暂时不可用”)
- 使用log.error("全局异常捕获", e),确保堆栈完整入库,方便排查
补充:WebMvcConfigurer与异常页面(可选)
如果项目还用JSP/Thymeleaf渲染页面,可额外配置:
- 实现WebMvcConfigurer,重写configureHandlerExceptionResolvers(),添加SimpleMappingExceptionResolver
- 为不同异常映射到不同错误页(如404.html、500.html),但REST API项目通常不需要
- 注意:@ControllerAdvice优先级高于SimpleMappingExceptionResolver,两者不冲突,前者更灵活
基本上就这些。不复杂但容易忽略的
是日志记录粒度和响应code的合理性——别让500满天飞,也别把业务错误全塞进200里返回错误信息。
# ai
# app
# js
# java
# html
# 栈
# 前端
# 处理器
# rest api
相关栏目:
<?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; ?>
】
相关推荐
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- windows如何测试网速_windows系统网络
- Mac电脑进水了怎么办_MacBook进水后紧急处
- Windows系统被恶意软件破坏后的恢复策略_错误
- Windows11怎样开启游戏模式_Windows
- LINUX怎么设置系统语言_LINUX修改中文环境
- 静态属性修改会影响所有实例吗_php作用域操作符下
- 如何使用Golang管理模块版本_Golanggo
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在包含多值的列中精准搜索指定演员?
- Win10系统映像怎么恢复 Win10使用系统映像
- Go语言中CookieJar的持久化机制解析:内存
- Python正则表达式实战_模式匹配说明【教程】
- Windows10如何更改计算机工作组_Win10
- Mac如何设置动态壁纸?(让桌面动起来)
- Python 模块的 __name__ 属性如何由
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- 如何使用Golang实现文件追加操作_向已有文件追
- 如何在Golang中指定模块版本_使用go.mod
- php增删改查报错1054怎么办_字段名错误排查修
- Win11怎么调整屏幕亮度_Windows 11调
- Win11怎么更改电脑名称_Windows 11修
- 如何在 ACF 中正确更新嵌套多层的 Group
- php内存溢出怎么排查_php内存限制调试与优化方
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- 电脑的“网络和共享中心”去哪了_Windows 1
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- Linux如何使用Curl发送请求_Linux下A
- c++怎么编写动态链接库dll_c++ __dec
- Windows10怎么查看系统激活状态_Windo
- Go 中 := 短变量声明的类型推导机制详解
- c# Task.ConfigureAwait(tr
- Win11如何设置系统声音_Win11系统声音调整
- php条件判断怎么写_ifelse和switchc
- 如何在 Go 中正确初始化结构体中的 map 字段
- 如何在 Python 测试中动态配置 @backo
- Win11怎么设置开机问候语_自定义Win11锁屏
- 如何使用Golang benchmark测量函数延
- c++怎么调用nana库开发GUI_c++ 现代风
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- 如何在 Go 中调用动态链接库(.so)中的函数
- Win11怎么看电池循环次数_Win11笔记本电池
- php中::能用于接口静态方法吗_接口静态方法调用
- Win11怎么用设置清理回收站_Win11设置清理
- Windows10如何更改桌面图标间距_Win10
- 如何使用Golang实现Web表单数据绑定_自动映
- php485支持哪些操作系统_php485跨系统支
- C++如何使用std::optional?(处理可
- Win11怎么查看已连接wifi密码 Win11查

QQ客服