springMVC--异常处理

news2024/11/23 8:51:56

文章目录

  • springMVC--异常处理
    • 基本介绍
    • 局部异常
      • 应用实例
        • 演示局部异常处理机制
        • 代码实现
        • 测试(页面方式)
    • 全局异常
      • 应用实例
        • 应用实例需求
        • 代码实现
        • 完成测试(页面方式)
    • 自定义异常
      • 应用实例
        • 应用实例需求
        • 应用实例-代码实现
        • 完成测试
    • 全局异常处理---SimpleMappingExceptionResolver
      • 基本说明
      • 应用实例
        • 需求
        • 代码实现
        • 完成测试(页面测试)
      • 对未知异常进行统一处理
        • 需求
        • 代码实现
        • 完成测试(页面测试)
    • 小结
        • 异常处理的优先级

springMVC–异常处理

基本介绍

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

局部异常

应用实例

演示局部异常处理机制

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

代码实现

创建springmvc\src\com\web\exception\MyExceptionHandler.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

<%@ 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

<%@ 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

// 如果类上标注了@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 , 增加方法

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

修改exception.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

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

修改MyExceptionHandler.java, 增加方法

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

修改exception.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
//统一的异常
@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
 <!--配置统一处理异常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

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

完成测试(页面测试)

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


对未知异常进行统一处理

需求

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

代码实现

  1. 修改MyExceptionHandler.java , 增加方法test04
//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value="/testException04")
public String test04(){
    String str = "hello";
    char c = str.charAt(10);
    return "success";
}
  1. 配置springDispatcherServlet-servlet.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
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
    	<title>未知异常信息</title>
    </head>
    <body>
    	<h1>朋友,系统发生了未知异常~</h1>
    </body>
</html>
  1. 修改exception.jsp , 增加超链接
<a href="testException03">
	测试统一的异常[SimpleMappingExceptionResolver]</a>
<br/><br/><a href="testException04"> 统一未归类异常</a>

完成测试(页面测试)

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


小结

异常处理的优先级

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 阿里云容器镜像服务

阿里云-容器镜像服务ACR 将本地/服务器docker image&#xff08;镜像&#xff09;推送到 阿里云容器镜像服务仓库 1. 在容器镜像服务ACR中创建个人实例 2. 进入个人实例 > 命名空间 创建命名空间 3. 进入个人实例 > 镜像仓库 创建镜像仓库 4. 进入镜像仓库 > 基本信…

商品分类新建,修改,删除。手机扫码开单打印进销存,商贸批发生产企业仓库条码管理软件系统

商品分类新建&#xff0c;手机扫码开单打印进销存&#xff0c;商贸批发生产企业仓库条码管理软件系统&#xff0c;超市便利店五金茶叶烟酒鞋帽门店零售手机收银管理软件APP_哔哩哔哩_bilibili本期视频讲解&#xff1a;商品分类新建, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚…

小程序picker 在苹果手机不兼容 bug,按month时在iPhone 显示不正确及自动定位时间问题

如下图&#xff1a;点击弹出时间列表&#xff1a;日历控件点击选择显示1年1月 解决: 加上起始时间字段 <picker mode"date" value"{{date}}" start"1970-09-01" end"2030-09-01"></picker> 问题二&#xff1a; 还是&a…

vant-ui,DatetimePicker时间选择器选择到秒

vant-ui的DatetimePicker 组件只能选择年月日时分&#xff0c;可能是组件维护者认为秒的选择用途不多&#xff0c;但是今天的需求中就是需要选择年月日时分秒所以就对DatetimePicker的组件封装成了可以选择年月日时分秒&#xff0c;直接上代码&#xff1a; 封装成组件&#xf…

【电源芯片】电量计(Gauge)介绍

对于电池供电的产品,比如手机、笔记本电脑、电动车等,我们都希望知道其电池还剩多少电、还能用多久,以便我们能放心使用,避免使用过程中电量用光而宕机。并且客户已经受到智能手机影响,需要其他更低端的设备也能有1%的电量显示,不再像以前的小灵通或是诺基亚手机那样只会…

2 Linux基础篇-Linux入门

2Linux基础篇-Linux入门 文章目录 2Linux基础篇-Linux入门2.1 Linux介绍2.2 Linux和Unix的关系 学习视频来自于B站 【小白入门 通俗易懂】2021韩顺平 一周学会Linux。 2.1 Linux介绍 常见的操作系统有 Windows、MacOS、Android、ios、Linux、Unix等。而其中&#xff0c;Linux是…

【C语言】动态内存管理详解

目录 为什么存在动态内存分配 动态内存函数的介绍 malloc 和 free calloc realloc 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟内存忘记释放&…

视频标注是什么?和图像数据标注的区别?

视频数据标注是对视频剪辑进行标注的过程。进行标注后的视频数据将作为训练数据集用于训练深度学习和机器学习模型。这些预先训练的神经网络之后会被用于计算机视觉领域。 自动化视频标注对训练AI模型有哪些优势 与图像数据标注类似&#xff0c;视频标注是教计算机识别对象…

DHCP部署与安全详解

文章目录 一、DHCP是什么&#xff1f;二、DHCP相关概念三、DHCP优点四、DHCP原理1. 客户机发送DHCP Discovery广播包&#xff08;发现谁是DHCP服务器&#xff09;2. 服务器响应DHCP Offer广播包3. 客户机发送DHCP Request广播包4. 服务器发送DHCP ACK广播包 五、DHCP续约六、部…

020 - like

LIKE&#xff1a;操作符用于在 WHERE 子句中搜索列中的指定模式。 语法&#xff1a; SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; -- 查询columnm字段名中以C开头的内容&#xff0c;%表示字母C后面可以是任意内容 select * from table名 where c…

IPv4 over IPv6简介

在IPv4 Internet向IPv6 Internet过渡的后期&#xff0c;IPv6网络已被大量部署&#xff0c;此时可能出现IPv4孤岛。利用隧道技术可在IPv6网络上创建隧道&#xff0c;从而实现IPv4孤岛的互连。这类似于在IP网络上利用隧道技术部署VPN。在IPv6网络上用于连接IPv4孤岛的隧道&#x…

Vue系列第五篇:Vue2(Element UI) + Go(gin框架) + nginx开发登录页面及其校验登录功能

本篇使用Vue2开发前端&#xff0c;Go语言开发服务端&#xff0c;使用nginx代理部署实现登录页面及其校验功能。 目录 1.部署结构 2.Vue2前端 2.1代码结构 2.1源码 3.Go后台服务 3.2代码结构 3.2 源码 3.3单测效果 4.nginx 5.运行效果 6.问题总结 1.部署结构 2.Vue2…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

pytorch学习——多层感知机

一.感知机 感知机——神经网络基本单元&#xff0c;最简单的深度网络称为多层感知机。多层感知机由多层神经元组成&#xff0c;每一层与它上一层相连&#xff0c;从中接收输入&#xff0c; 同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 解释&#xff1a;如果…

分布式I/O,IT和OT融合少不了它

长期以来信息技术IT和操作运营技术OT是相互隔离的&#xff0c;随着大数据分析和边缘计算业务的对现场级实时数据的采集需求&#xff0c;IT和OT有了逐渐融合的趋势。IT与OT融合&#xff0c;它赋予工厂的管理者监控运行和过程的能力大为增强&#xff0c;甚至可以预测到可能发生的…

Vue2到3 全套学习内容(持续更新)

Vue 初次上手 1. Vue 概念 概念: Vue 是一个用于 构建用户界面 的 渐进式 框架 ①构建用户界面&#xff1a;基于数据动态渲染出用户看到的页面 ②渐进式&#xff1a;循序渐进 Vue的两种使用方式: ①Vue 核心包开发 场景: 局部 模块改造 ②Vue核心包&Vue插件工程化开发…

Echarts 地图点击板块高亮,再次点击还是高亮,在地图外点击返回,则不高亮。

需求就是&#xff1a;点击广东省板块&#xff0c;广东省高亮&#xff0c;再次点击广东省还是高亮&#xff0c;如果再点击内蒙古&#xff0c;则内蒙古高亮&#xff0c;广东不高亮。 点击返回全国&#xff0c;则都不高亮。 1、返回全国 //返回全国 backQG(){ this.clickCity 全…

多租户分缓存处理

多租户redis缓存分租户处理 那么数据库方面已经做到了拦截&#xff0c;但是缓存还是没有分租户&#xff0c;还是通通一个文件夹里&#xff0c; 想实现上图效果&#xff0c;global文件夹里存的是公共缓存。 首先&#xff0c;那么就要规定一个俗称&#xff0c;缓存名字带有globa…

安全学习DAY08_算法加密

算法加密 漏洞分析、漏洞勘测、漏洞探针、挖漏洞时要用到的技术知识 存储密码加密-应用对象传输加密编码-发送回显数据传输格式-统一格式代码特性混淆-开发语言 传输数据 – 加密型&编码型 安全测试时&#xff0c;通常会进行数据的修改增加提交测试 数据在传输的时候进行…

Kotlin基础(八):泛型

前言 本文主要讲解kotlin泛型&#xff0c;主要包括泛型基础&#xff0c;类型变异&#xff0c;类型投射&#xff0c;星号投射&#xff0c;泛型函数&#xff0c;泛型约束&#xff0c;泛型在Android中的使用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 泛型基…