前言
在现代软件开发中,异常处理是不可或缺的一部分,它能够有效地提高系统的稳定性和健壮性。在Spring MVC框架中,异常处理机制起着至关重要的作用,它允许开发者在程序运行过程中捕获、处理和报告异常,从而保障用户体验和系统可靠性。本文将带您深入探索Spring MVC异常处理的核心概念、不同的处理策略以及如何构建一个稳固的异常处理机制。
个人主页:尘觉主页
个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力
在csdn获奖荣誉: csdn城市之星2名
Java全栈群星计划top前5
端午大礼包获得者
欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦
Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据
绑定以及目标方法执行时发生的异常
主要处理 Handler 中用 -@ExceptionHandler 注解定义的方法。
ExceptionHandlerMethodResolver 内部若找不到–@ExceptionHandler 注解的话,会找
@ControllerAdvice 类的@ExceptionHandler 注解方法,这样就相当于一个全局异常处理器
如果不处理异常, 非常的不友好
@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";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息title>
head>
<body>
<h1>测试异常h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常a><br><br>
body>
html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息提示title>
head>
<body>
<h1>朋友, 程序发生了异常...h1>
异常信息- ${requestScope.reason}
body>
html>
浏览器 http://localhost:8080/springmvc/exception.jsp
ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找
@ControllerAdvice 类的@ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器
这个上面已经演示了这里只是补充说明
@RequestMapping(value = "/testGlobalException")
public String global(){
//解读
//1. 这里我们模拟了一个异常 NumberFormatException
//2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理
int num = Integer.parseInt("hello");
return "success";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息title>
head>
<body>
<h1>测试异常h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常a><br><br>
body>
html>
如上面测试一样
通过@ResponseStatus 注解, 可以自定义异常的说明
@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException {
public AgeException() {
}
public AgeException(String message) {
super(message);
}
}
@RequestMapping(value = "/testException02")
public String test02(){
throw new AgeException("年龄必须在1-120之间~~~");
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息title>
head>
<body>
<h1>测试异常h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常a><br/><br/>
body>
html>
浏览器 http://localhost:8080/springmvc/exception.jsp
对数组越界异常进行统一处理,使用 SimpleMappingExceptionResolver处理
@RequestMapping(value = "/testException03")
public String test03(){
int[] arr = new int[]{3,9,10,190};
//抛出一个数组越界的异常 ArrayIndexOutOfBoundsException
System.out.println(arr[90]);
return "success";
}
解释一下为什么只写arrEX因为我们前面配置了 prefix/WEB-INF/pages/和suffix .jsp所以默认会拼接
arrEx
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>数组越界异常title>
head>
<body>
<h1><异常>异常>信息: 数组越界异常h1>
body>
html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息title>
head>
<body>
<h1>测试异常h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常a><br/><br/>
<a href="<%=request.getContextPath()%>/testException03">点击测试统一处理异常a><br/><br/>
body>
html>
(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp
(postman) 测 http://localhost:8080/springmvc/testException03
页面就不展示了
对未知异常进行统一处理,使用 SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrExprop>
<prop key="java.lang.Exception">allExprop>
props>
property>
bean>
//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value = "/testException04")
public String test04(){
String str = "hello";
//这里会抛出 StringIndexOutOfBoundsException
char c = str.charAt(10);
return "success";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>未知异常信息title>
head>
<body>
<h1>朋友,系统发生了未知异常~, 请联系网站管理员h1>
body>
html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>异常信息title>
head>
<body>
<h1>测试异常h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常a><br/><br/>
<a href="<%=request.getContextPath()%>/testException03">点击测试统一处理异常a><br/><br/>
<a href="<%=request.getContextPath()%>/testException04">点击测试未知异常a><br/><br/>
body>
html>
(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp
(postman) 测试http://localhost:8080/springmvc/testException04
局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat 默认机制
arrEx
在本文中,我们深入研究了Spring MVC的异常处理机制,从局部异常处理到全局异常处理,再到通过SimpleMappingExceptionResolver进行统一处理,我们详细介绍了每种方法的配置和使用。异常处理在软件开发中扮演着守护者的角色,它可以让我们更好地掌控程序在各种情况下的行为,提高系统的健壮性和可维护性。
无论是在局部还是全局,合适的异常处理都能帮助我们更好地处理潜在的问题,使用户能够获得友好的错误提示,同时也为开发者提供了定位和解决问题的线索。掌握Spring MVC异常处理的技巧,将为您的项目增添一层安全防护,让用户体验更加顺畅,系统更加可靠。希望本文对您理解异常处理的重要性,以及如何在Spring MVC中高效地应用异常处理策略提供了有益的指导。
热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力