苏州网站建设布局,网站文章伪原创怎么做,网站建设高度,网站租用空间价格#x1f600;前言 在现代软件开发中#xff0c;异常处理是不可或缺的一部分#xff0c;它能够有效地提高系统的稳定性和健壮性。在Spring MVC框架中#xff0c;异常处理机制起着至关重要的作用#xff0c;它允许开发者在程序运行过程中捕获、处理和报告异常#xff0c;从… 前言 在现代软件开发中异常处理是不可或缺的一部分它能够有效地提高系统的稳定性和健壮性。在Spring MVC框架中异常处理机制起着至关重要的作用它允许开发者在程序运行过程中捕获、处理和报告异常从而保障用户体验和系统可靠性。本文将带您深入探索Spring MVC异常处理的核心概念、不同的处理策略以及如何构建一个稳固的异常处理机制。 个人主页尘觉主页
个人简介大家好我是尘觉希望我的文章可以帮助到大家您的满意是我的动力 在csdn获奖荣誉: csdn城市之星2名 Java全栈群星计划top前5 端午大礼包获得者 欢迎大家这里是CSDN我总结知识的地方欢迎来到我的博客感谢大家的观看 如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦 文章目录 解密Spring MVC异常处理从局部到全局打造稳固系统的关键步骤异常处理-基本介绍局部异常演示局部异常处理机制创建MyExceptionHandler创建exception.jsp创建exception_mes.jsp测试(页面方式)测试(Postman 方式 全局异常解读修改MyExceptionHandler增加方法修改exception.jsp增加语句测试 异常优先级异常处理时局部异常 优先级高于 全局异常需求创建AgeException.java修改MyExceptionHandler增加方法修改 exception.jsp, 增加超链完成测试页面测是完成测试postman SimpleMappingExceptionResolver基本说明代码演示修改 MyExceptionHandler.java , 增加方法test03配置 springDispatcherServlet-servlet.xml创建arrEx.jsp修改 exception.jsp并完成测试 对未知异常进行统一处理修改 MyExceptionHandler.java , 增加方法test04创建allEx.jsp修改 exception.jsp , 增加超链接并完成测试 异常处理的优先级梳理● 异常处理的优先级 全部xml配置总结 解密Spring MVC异常处理从局部到全局打造稳固系统的关键步骤
异常处理-基本介绍 Spring MVC 通过 HandlerExceptionResolver 处理程序的异常包括 Handler 映射、数据 绑定以及目标方法执行时发生的异常 主要处理 Handler 中用 -ExceptionHandler 注解定义的方法。 ExceptionHandlerMethodResolver 内部若找不到–ExceptionHandler 注解的话会找 ControllerAdvice 类的ExceptionHandler 注解方法,这样就相当于一个全局异常处理器
局部异常
演示局部异常处理机制
如果不处理异常, 非常的不友好 创建MyExceptionHandler ExceptionHandler({ArithmeticException.class,NullPointerException.class})public String localException(Exception ex, HttpServletRequest request){System.out.println(局部异常信息是- ex.getMessage());//如何将异常的信息带到下一个页面.request.setAttribute(reason, ex.getMessage());return exception_mes;}/*** 解读* 1. 编写方法模拟异常, 算术异常* 2. 如果我们不做异常处理是由tomcat默认页面显示**/RequestMapping(value /testException01)public String test01(Integer num) {int i 9 / num;return success;}创建exception.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息/title
/head
body
h1测试异常/h1
a href%request.getContextPath()%/testException01?num0点击测试局部异常/abrbr
/body
/html创建exception_mes.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息提示/title
/head
body
h1朋友, 程序发生了异常.../h1
异常信息- ${requestScope.reason}
/body
/html测试(页面方式)
浏览器 http://localhost:8080/springmvc/exception.jsp 测试(Postman 方式 全局异常
ExceptionHandlerMethodResolver 内部若找不到ExceptionHandler 注解的话会找 ControllerAdvice 类的ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器
这个上面已经演示了这里只是补充说明
解读
这里我们模拟了一个异常 NumberFormatException该异常没有在局部异常处理按照异常处理机制就会交给全局异常处理类处理
修改MyExceptionHandler增加方法 RequestMapping(value /testGlobalException)public String global(){//解读//1. 这里我们模拟了一个异常 NumberFormatException//2. 该异常没有在局部异常处理按照异常处理机制就会交给全局异常处理类处理int num Integer.parseInt(hello);return success;}修改exception.jsp增加语句
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息/title
/head
body
h1测试异常/h1
a href%request.getContextPath()%/testException01?num0点击测试局部异常/abrbr
a href%request.getContextPath()%/testGlobalException点击测试全局异常/abrbr/body
/html测试
如上面测试一样
异常优先级
异常处理时局部异常 优先级高于 全局异常
需求
通过ResponseStatus 注解, 可以自定义异常的说明
创建AgeException.java
ResponseStatus(reason 年龄需要在1-120之间, value HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException {public AgeException() {}public AgeException(String message) {super(message);}
}修改MyExceptionHandler增加方法 RequestMapping(value /testException02)public String test02(){throw new AgeException(年龄必须在1-120之间~~~);}修改 exception.jsp, 增加超链
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息/title
/head
body
h1测试异常/h1
a href%request.getContextPath()%/testException01?num0点击测试局部异常/abrbr
a href%request.getContextPath()%/testGlobalException点击测试全局异常/abrbr
a href%request.getContextPath()%/testException02点击测试自定义异常/abr/br/
/body
/html完成测试页面测是
浏览器 http://localhost:8080/springmvc/exception.jsp 完成测试postman SimpleMappingExceptionResolver
基本说明
如果希望对所有异常进行统一处理可以使用 SimpleMappingExceptionResolver它将异常类名映射为视图名即发生异常时使用对应的视图报告异常需要在 ioc容器中配置
代码演示
对数组越界异常进行统一处理使用 SimpleMappingExceptionResolver处理
修改 MyExceptionHandler.java , 增加方法test03 RequestMapping(value /testException03)public String test03(){int[] arr new int[]{3,9,10,190};//抛出一个数组越界的异常 ArrayIndexOutOfBoundsExceptionSystem.out.println(arr[90]);return success;}配置 springDispatcherServlet-servlet.xml
解释一下为什么只写arrEX因为我们前面配置了 prefix/WEB-INF/pages/和suffix .jsp所以默认会拼接 bean classorg.springframework.web.servlet.handler.SimpleMappingExceptionResolverproperty nameexceptionMappingspropsprop keyjava.lang.ArrayIndexOutOfBoundsExceptionarrEx/prop/props/property/bean创建arrEx.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle数组越界异常/title
/head
body
h1异常/异常信息: 数组越界异常/h1
/body
/html修改 exception.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息/title
/head
body
h1测试异常/h1
a href%request.getContextPath()%/testException01?num0点击测试局部异常/abrbr
a href%request.getContextPath()%/testGlobalException点击测试全局异常/abrbr
a href%request.getContextPath()%/testException02点击测试自定义异常/abr/br/
a href%request.getContextPath()%/testException03点击测试统一处理异常/abr/br/
/body
/html并完成测试
(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp
(postman) 测 http://localhost:8080/springmvc/testException03
页面就不展示了
对未知异常进行统一处理
对未知异常进行统一处理使用 SimpleMappingExceptionResolver !--配置统一处理异常Bean--bean classorg.springframework.web.servlet.handler.SimpleMappingExceptionResolverproperty nameexceptionMappingspropsprop keyjava.lang.ArrayIndexOutOfBoundsExceptionarrEx/propprop keyjava.lang.ExceptionallEx/prop/props/property/bean修改 MyExceptionHandler.java , 增加方法test04 //如果发生了没有归类的异常 可以给出统一提示页面RequestMapping(value /testException04)public String test04(){String str hello;//这里会抛出 StringIndexOutOfBoundsExceptionchar c str.charAt(10);return success;}创建allEx.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle未知异常信息/title
/head
body
h1朋友系统发生了未知异常~, 请联系网站管理员/h1
/body
/html修改 exception.jsp , 增加超链接
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle异常信息/title
/head
body
h1测试异常/h1
a href%request.getContextPath()%/testException01?num0点击测试局部异常/abrbr
a href%request.getContextPath()%/testGlobalException点击测试全局异常/abrbr
a href%request.getContextPath()%/testException02点击测试自定义异常/abr/br/
a href%request.getContextPath()%/testException03点击测试统一处理异常/abr/br/
a href%request.getContextPath()%/testException04点击测试未知异常/abr/br/
/body
/html并完成测试
(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp
(postman) 测试http://localhost:8080/springmvc/testException04
异常处理的优先级梳理
● 异常处理的优先级
局部异常 全局异常 SimpleMappingExceptionResolver tomcat 默认机制
全部xml配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd!--配置自动扫描包--context:component-scan base-packagecom.wyxdu.web/!--配置视图解析器[默认视图解析器]--bean classorg.springframework.web.servlet.view.InternalResourceViewResolver!--配置属性suffix 和 prefix--property nameprefix value/WEB-INF/pages//property namesuffix value.jsp/!--调整优先级--property nameorder value10//bean!--解读1. 配置自定义视图解析器BeanNameViewResolver2. BeanNameViewResolver可以去解析我们自定义的视图3. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高4. 属性 order 的默认值是最低优先级 值为 Integer.MAX_VALUEint LOWEST_PRECEDENCE 2147483647--bean classorg.springframework.web.servlet.view.BeanNameViewResolverproperty nameorder value99//bean!-- 配置国际化错误信息的资源处理bean --bean idmessageSource classorg.springframework.context.support.ResourceBundleMessageSource!-- 配置国际化文件名字如果你这样配的话表示messageSource回到 src/i18nXXX.properties去读取错误信息--property namebasename valuei18n/property/bean!--配置文件上传需要的bean--bean classorg.springframework.web.multipart.commons.CommonsMultipartResolveridmultipartResolver/!--配置自定义拦截器-spring配置文件--mvc:interceptors!--解读1. 第一种配置方式2. 使用ref 引用到对应的myInterceptor013. 这种方式会拦截所有的目标方法--!--ref beanmyInterceptor01/--!--解读1. 第二种配置方式2. mvc:mapping path/hi 指定要拦截的路径3. ref beanmyInterceptor01 指定对哪个拦截器进行配置--
!-- mvc:interceptor--
!-- mvc:mapping path/hi/--
!-- ref beanmyInterceptor01/--
!-- /mvc:interceptor--!--解读1. 第3种配置方式2. mvc:mapping path/h* 通配符方式 表示拦截 /h 打头的路径3. mvc:exclude-mapping path/hello /hello不拦截4. ref beanmyInterceptor01 指定对哪个拦截器配置--mvc:interceptormvc:mapping path/h*/mvc:exclude-mapping path/hello/ref beanmyInterceptor01//mvc:interceptor!--解读1.配置的第二个拦截器2.多个拦截器在执行时是顺序执行--mvc:interceptormvc:mapping path/h*/ref beanmyInterceptor02//mvc:interceptor/mvc:interceptors!--配置统一处理异常Bean--bean classorg.springframework.web.servlet.handler.SimpleMappingExceptionResolverproperty nameexceptionMappingspropsprop keyjava.lang.ArrayIndexOutOfBoundsExceptionarrEx/prop!--prop keyjava.lang.ExceptionallEx/prop--/props/property/bean!--加入两个常规配置--!--支持SpringMVC的高级功能比如JSR303校验, 映射动态请求--mvc:annotation-driven/mvc:annotation-driven
!-- 将springmvc不能处理的请求交给tomcat处理,比如css, js--mvc:default-servlet-handler/
/beans总结
在本文中我们深入研究了Spring MVC的异常处理机制从局部异常处理到全局异常处理再到通过SimpleMappingExceptionResolver进行统一处理我们详细介绍了每种方法的配置和使用。异常处理在软件开发中扮演着守护者的角色它可以让我们更好地掌控程序在各种情况下的行为提高系统的健壮性和可维护性。
无论是在局部还是全局合适的异常处理都能帮助我们更好地处理潜在的问题使用户能够获得友好的错误提示同时也为开发者提供了定位和解决问题的线索。掌握Spring MVC异常处理的技巧将为您的项目增添一层安全防护让用户体验更加顺畅系统更加可靠。希望本文对您理解异常处理的重要性以及如何在Spring MVC中高效地应用异常处理策略提供了有益的指导。
热门专栏推荐 想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集 linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
欢迎大家加入我的社区 尘觉社区 文章到这里就结束了如果有什么疑问的地方请指出诸佬们一起来评论区一起讨论 希望能和诸佬们一起努力今后我们一起观看感谢您的阅读 如果帮助到您不妨3连支持一下创造不易您们的支持是我的动力