springMVC--异常处理

文章目录

springMVC--异常处理

基本介绍

  1. Spring MVC 通过HandlerExceptionResolver 处理程序的异常,包括Handler 映射、数据绑定以及目标方法执行时发生的异常。
  2. 主要处理Handler 中用@ExceptionHandler 注解定义的方法。
  3. ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话, 会找@ControllerAdvice 类的@ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器。

局部异常

应用实例

演示局部异常处理机制

如果不处理异常, 对用户非常的不友好。

代码实现

创建springmvc\src\com\web\exception\MyExceptionHandler.java

java 复制代码
@Controller
public class MyExceptionHandler {
    /**
     * 1. localException 方法处理局部异常
     * 2. 这里处理ArithmeticException.class,NullPointerException.class类型的异常
     * 3. Exception ex: 生成的异常对象,会传递给ex, 通过ex可以得到相关的异常信息,这里程序员可以加入自己的业务逻辑
     */
    @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";
    }
}

创建springmvc\web\exception.jsp

jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    <title>异常信息</title>
    </head>
    <body>
        <h1>测试异常</h1>
        <a href="testException01?num=0">点击测试异常</a><br><br>
    </body>
</html>

创建显示异常信息页面/WEB-INF/pages/exception_mes.jsp

jsp 复制代码
<%@ 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

感兴趣的可以debug一下源码。

全局异常

应用实例

应用实例需求

演示全局异常处理机制, ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找@ControllerAdvice 类的@ExceptionHandler 注解方法,这样就相当于一个全局异常处理器。

代码实现

创建springmvc\src\com\web\exception\MyGlobalException.java

java 复制代码
// 如果类上标注了@ControllerAdvice,就是一个全局异常处理类
@ControllerAdvice
public class MyGlobalException {
    /**
     * 1. 全局异常就不管是哪个Handler抛出的异常,都可以捕获 , @ExceptionHandler({异常类型})
     * 2. 这里处理的全局异常是NumberFormatException.class,ClassCastException.class
     * 3. Exception ex 接收抛出的异常对象
     */
    @ExceptionHandler({NumberFormatException.class, ClassCastException.class})
    public String globalException(Exception ex, HttpServletRequest request) {
        System.out.println("全局异常处理-" + ex.getMessage());
        //如何将异常的信息带到下一个页面.
        request.setAttribute("reason", ex.getMessage());
        return "exception_mes";
    }
}

修改MyExceptionHandler.java , 增加方法

java 复制代码
    @RequestMapping(value = "/testGlobalException")
    public String global(){
        //1. 这里我们模拟了一个异常 NumberFormatException
        //2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理
        int num = Integer.parseInt("hello");
        return "success";
    }

修改exception.jsp

jsp 复制代码
<a href="testException01?num=0">点击测试异常</a><br><br>
<a href="testGlobalException">点击测试全局异常</a><br><br>

完成测试(页面方式)

浏览器输入http://localhost:8080/springmvc/exception.jsp


自定义异常

应用实例

应用实例需求

通过@ResponseStatus 注解, 可以自定义异常的说明。

应用实例-代码实现

创建springmvc\src\com\web\exception\AgeException.java

java 复制代码
@ResponseStatus(reason="年龄需要在1-120 之间",value= HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException{
}

修改MyExceptionHandler.java, 增加方法

java 复制代码
//抛出自定义异常
@RequestMapping(value="/testException02")
public String test02(){
throw new AgeException();
}

修改exception.jsp, 增加超链接

jsp 复制代码
<a href="testGlobalException">点击测试全局异常</a><br><br>
<a href="testException02">点击测试自定义异常</a><br/><br/>

完成测试

浏览器输入http://localhost:8080/springmvc/exception.jsp


全局异常处理---SimpleMappingExceptionResolver

基本说明

  1. 如果希望对所有异常进行统一处理,可以使用SimpleMappingExceptionResolver。
  2. 它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。
  3. 需要在ioc 容器中配置。

应用实例

需求

对数组越界异常进行统一处理,使用SimpleMappingExceptionResolver.

代码实现

  1. 修改MyExceptionHandler.java , 增加方法test03
java 复制代码
//统一的异常
@RequestMapping(value="/testException03")
public String test03(){
    int[] arr = new int[]{3,9,10,190};
    System.out.println(arr[90]);
    return "success";
}
  1. 配置springDispatcherServlet-servlet.xml
xml 复制代码
 <!--配置统一处理异常Bean-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
            </props>
        </property>
    </bean>
<!-- 加入两个常规配置-->
<!-- 能支持SpringMVC 高级功能,比如JSR303 校验,映射动态请求-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 将SpringMVC 不能处理的请求交给Tomcat, 比如请求css,js 等-->
<mvc:default-servlet-handler/>

创建/WEB-INF/pages/arrEx.jsp

jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    	<title>数组越界了</title>
    </head>
    <body>
    	<h1>数组越界了~</h1>
    </body>
</html>
  1. 修改exception.jsp
jsp 复制代码
<a href="testException03">
测试统一的异常[SimpleMappingExceptionResolver]</a>

完成测试(页面测试)

浏览器输入http://localhost:8080/springmvc/exception.jsp


对未知异常进行统一处理

需求

对未知异常进行统一处理,使用SimpleMappingExceptionResolver。

代码实现

  1. 修改MyExceptionHandler.java , 增加方法test04
java 复制代码
//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value="/testException04")
public String test04(){
    String str = "hello";
    char c = str.charAt(10);
    return "success";
}
  1. 配置springDispatcherServlet-servlet.xml
xml 复制代码
<!--配置统一处理异常Bean-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <prop key="java.lang.Exception">allEx</prop>
            </props>
        </property>
    </bean>
  1. 创建/WEB-INF/pages/otherEx.jsp
jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    	<title>未知异常信息</title>
    </head>
    <body>
    	<h1>朋友,系统发生了未知异常~</h1>
    </body>
</html>
  1. 修改exception.jsp , 增加超链接
jsp 复制代码
<a href="testException03">
	测试统一的异常[SimpleMappingExceptionResolver]</a>
<br/><br/><a href="testException04"> 统一未归类异常</a>

完成测试(页面测试)

浏览器输入http://localhost:8080/springmvc/exception.jsp


小结

异常处理的优先级

局部异常> 全局异常> SimpleMappingExceptionResolver > tomcat 默认机制。

相关推荐
陈哈哈11118 分钟前
折腾了半天,总算把 Vim 9.2 装明白了
笔记
陈哈哈11118 分钟前
折腾了半天,总算把 OpenGL 的开发环境给装明白了
笔记
海岳云舟41 分钟前
springboot单元测试技术
java·后端·spring
深圳老胡1 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节
正弦波_Wave1 小时前
【Orcad原理图打印Pdf】
笔记·pdf
海绵宝宝的月光宝盒1 小时前
7-AutoCAD-参考线、多行文字、填充命令应用
经验分享·笔记·学习·职场和发展·课程设计·制造·cad
无锡银洲自动化1 小时前
汽包电极故障难发现?UDZ 智能电接点液位计调试小结
笔记·产品运营
n 55!w !1081 小时前
MySQL数据库笔记整理1
数据库·笔记·mysql
weixin_448771722 小时前
Spring框架之ConfigurableApplicationContext源码学习
java·spring
运维踩坑日记2 小时前
OpenStack 核心服务实战笔记
linux·运维·服务器·笔记·openstack