SpringMVC全局异常处理

一、Java中的异常

定义:异常是程序在运行过程中出现的一些错误,使用面向对象思想把这些错误用类来描述,那么一旦产生一个错误,即创建某一个错误的对象,这个对象就是异常对象。

类型:

声明异常:在每个方法声明中,使用键字throws标识该方法可能抛出的必检异常的类型称为声明异常,如此告知方法的调用者该方法内可能有此类异常。

public void myMethod() throws IOException { //some code }

抛出异常:当检测到错误的程序可以创建一个合适的异常类型的实例并抛出它就叫做抛出一个异常。

IllegalArgumentException ex=new II1egalArgumentException("EX Msg"); throw ex; 或者 throw new IllegalArgumentException("EX Msg");

捕获异常:当抛出一个异常时,可以在try-catch代码块中捕获和处理。try语句块中是可能出现问题的代码;catch语句块中是出现问题并捕获后,处理问题的代码内容,如果问题在try语句块中没有出现则catch中语句不会运行;finally语句块中是不管问题异常是否产生都要执行的代码内容。

try{

codeA;//业务代码A

throw new BizException("邮箱格式错误!");//抛出异常

codeB;//业务代码B

} catch(Exception e) {

codeC;//处理异常代码

} finally {

codeD;//关闭资源(IO 数据库 网络),收尾处理的一些工作

}

自定义异常:

二、SpringMVC异常处理

编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是Dao层、Service层还是Controller层,都有可能抛出异常。在SpringMVC中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。使用一个友好的页面显示,而不是一堆看不懂的错误信息。

全局统一异常实现方式

自带的SimpleMappingExceptionResolver

实现HandlerExceptionResolver接口

@ControllerAdvice + @ExceptionHandler注解

1、方式一:默认异常处理器

2、方式二:实现HandlerExceptionResolver接口

(1)创建异常处理器:在工程中创建GlobalExceptionResolver异常处理器类,捕获异常后页面跳转到error页面。

(2)注册异常处理器Bean:在spring-mvc.xml中,注册定义的GlobalExceptionResolver处理器。

或者在自定义异常处理类上添加@Component注解

(3)自定义异常类:创建自定义BizException异常类,业务代码统一使用自定义异常BizException抛出错误信息。

(4)定义业务处理器方法:在Controller中,定义获取图书信息方法,并返回结果。如果图书ID传入大于100时,抛出数据获取异常信息。

(5)创建异常显示视图:使用error.jsp页面统一显示系统中出现的异常信息。

3、方式三:@ControllerAdvice+@ExceptionHandler

(1)创建异常处理器:创建GlobalExceptionHandler异常处理器类,根据捕获的不同异常,并返回相应的异常信息。

(2)定义业务处理器方法:在Controller中,定义获取图书信息方法,并返回结果。如果图书ID传入大于100时,抛出数据获取异常信息。

全局异常处理只能捕获Controller层未捕获(或往外抛)的异常,对于 Interceptor层的异常,或Spring框架层的异常,就无能为力了。

相关推荐
徐子童7 小时前
网络协议---TCP协议
网络·网络协议·tcp/ip·面试题·1024程序员节
扫地的小何尚2 天前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
数据皮皮侠AI3 天前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
开开心心就好3 天前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
Evan东少6 天前
[踩坑]笔记本Ubuntu20.04+NvidiaRTX5060驱动+cuda+Pytorch+ROS/Python实现人脸追踪(环境准备)
1024程序员节
不爱编程的小陈7 天前
C/C++每日面试题
面试·职场和发展·1024程序员节
开开心心就好7 天前
右键菜单管理工具,添加程序自定义名称位置
linux·运维·服务器·ci/cd·docker·pdf·1024程序员节
码农三叔8 天前
(4-2-05)Python SDK仓库:MCP服务器端(5)Streamable HTTP传输+Streamable HTTP传输
开发语言·python·http·大模型·1024程序员节·mcp·mcp sdk
西幻凌云12 天前
初始——正则表达式
c++·正则表达式·1024程序员节
启芯硬件12 天前
电源XL6009E1的dieshot细节分析-芯片设计干货
大数据·经验分享·硬件工程·1024程序员节