SpringMVC系列十二: 异常处理

异常处理

  • 异常处理
    • 基本介绍
    • 局部异常
      • 应用实例
      • Debug处理流程
    • 全局异常
      • 应用实例
      • Debug处理流程
      • 异常处理时: 局部异常 优先级高于 全局异常
    • 自定义异常
      • 应用实例
      • Debug处理流程
    • SimpleMappingExceptionresovler
      • 基本说明
      • 应用实例
      • 对未知异常进行统一处理
      • 异常处理的优先级梳理

上一讲, 我们学习的是 SpringMVC系列十一: 文件上传与自定义拦截器

现在打开springmvc项目

在这里插入图片描述

异常处理

基本介绍

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

局部异常

应用实例

应用实例需求
演示局部异常处理机制
-如果不处理异常, 非常的不友好
在这里插入图片描述

1.在com.zzw.web.exception新建MyExceptionHandler

@Controller
public class MyExceptionHandler {//编写方法, 模拟异常, 算术异常@RequestMapping(value = "/testException01")public String test01(Integer num) {int i = 9 / num;return "success";}
}

2.web路径新建exception.jsp

<head><title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br/><br/>
</body>

3.测试, 抛错
在这里插入图片描述

4.MyExceptionHandler新增 localException (), 处理局部异常

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

5.新增web路径/excetion_mes.jsp

<head><title>异常信息提示</title>
</head>
<body>
<h1>朋友, 你程序出问题了!</h1>
异常信息 - ${requestScope.reason}
</body>

6.测试
在这里插入图片描述
在这里插入图片描述

Debug处理流程

打断点
在这里插入图片描述

测试
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全局异常

应用实例

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

●代码实现
1.新建com.zzw.web.exception.MyGlobalException

/*** 如果类上标注了@ControllerAdvice, 就是一个全局异常处理类*/
@ControllerAdvice
public class MyGlobalException {/*** 解读* 1.全局异常就不管是哪个Handler抛出的异常, 即都可以捕获. 格式是 @ExceptionHandler({异常类型})* 2.这里我们处理的全局异常是 NumberFormatException.class, ClassCastException.class* 3.Exception ex, 接收抛出的异常对象* @return*/@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";}
}

2.MyExceptionHandler新增 global()方法

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

3.exception.jsp新增代码

<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a><br/><br/>

4.测试
在这里插入图片描述在这里插入图片描述

Debug处理流程

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述点击下一步

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

继续往下走

在这里插入图片描述
继续往下走

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

继续往下走

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

异常处理时: 局部异常 优先级高于 全局异常

假如我们把NumberFormatException异常也放进了局部异常处理, 那么在调用 global() 的时候, 优先去找本类的局部异常处理.

自定义异常

应用实例

●应用实例需求
通过 @ResponseStatus 注解, 可以自定义异常的说明

●应用实例-代码实现
1.新建com.zzw.web.exception.AgeException

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

2.修改MyExceptionHandler, 增加方法

 @RequestMapping(value = "/testException02")
public String test02() {throw new AgeException("年龄必须在1-120之间~~~");
}

3.修改exception.jsp, 增加超链接

<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常</a>

4.测试

在这里插入图片描述
在这里插入图片描述
5.在自定义异常中加两个构造器

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

被全局异常捕获全局

Debug处理流程

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

继续往下走

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

找到了globalException()方法

在这里插入图片描述
在这里插入图片描述

SimpleMappingExceptionresovler

基本说明

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

应用实例

●应用实例 - 需求
对数组越界异常进行统一处理, 使用SimpleMappingExceptionResolver

●应用实例 - 代码实现
1.修改MyExceptionHandler.java, 增加方法test03

@RequestMapping(value = "/testException03")
public String test03() {int[] arr = new int[]{1, 2, 3, 4, 5};//抛出一个数据越界的异常 ArrayOutOfBoundsExceptionSystem.out.println(arr[90]);return "success";
}

2.配置springDispatcherServlet-servlet.xml

<!--配置统一处理异常-->
<beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop></props></property>
</bean>

3.web路径/WEB-INF/pages/arrEx.jsp

<head><title>数组越界异常</title>
</head>
<body>
异常信息 - 数据越界
</body>

4.修改exception.jsp, 增加代码

<a href="<%=request.getContextPath()%>/testException03">点击测试统一异常</a><br/><br/>

5,测试
在这里插入图片描述
在这里插入图片描述

对未知异常进行统一处理

⭐应用实例 - 需求
对未知异常进行统一处理, 使用SimpleMappingExceptionResolver

⭐应用实例 - 代码实现
1.修改myExceptionHandler.java, 增加方法test04()

//如果发生了没有归类的异常, 可以给出统一提示页面
@RequestMapping(value = "/testException04")
public String test04() {String str = "hello";//这里会抛出 StringIndexOutOfBoundsExceptionchar c = str.charAt(10);return "success";
}

2.继续配置

<!--配置统一处理异常-->
<beanclass="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>

3.web路径/WEB-INF/pages/allEx.jsp

<head><title>未知异常信息</title>
</head>
<body>
<h1>系统发生了异常, 联系网站管理员~</h1>
</body>

4.修改exception.jsp, 增加代码

<a href="<%=request.getContextPath()%>/testException04">点击测试未知异常</a><br/><br/>

5.测试
在这里插入图片描述
在这里插入图片描述

异常处理的优先级梳理

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

1.测试
在这里插入图片描述

局部异常全局异常SimpleMappingExceptionResolver
ArrayIndexOutOfBoundsException.classArrayIndexOutOfBoundsException.class<prop key=“java.lang.ArrayIndexOutOfBoundsException”>arrEx</prop>
局部异常全局异常SimpleMappingExceptionResolver
 ArrayIndexOutOfBoundsException.class<prop key=“java.lang.ArrayIndexOutOfBoundsException”>arrEx</prop>
局部异常全局异常SimpleMappingExceptionResolver
  <prop key=“java.lang.ArrayIndexOutOfBoundsException”>arrEx</prop>
局部异常全局异常SimpleMappingExceptionResolver
  <prop key=“ArrayIndexOutOfBoundsException”>arrEx</prop>

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

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

相关文章

ECMAScript 6 新特性下篇

ECMAScript 6 新特性续 对象字面量增强 ES6中的对象字面量增强是一种简化对象创建的语法,它可以让我们更方便地定义对象的属性和方法。下面是对ES6对象字面量增强的详细解析与代码示例。 1、简洁属性名 在ES6之前,我们在定义对象属性时,需要将属性名和属性值都写出来。…

Java根据http路径判断路径是否可以访问、获取文件大小

/*** 路径是否可以访问* param urlString* return*/public static boolean isUrlAccessible(String urlString) {try {URL url new URL(urlString);HttpURLConnection connection (HttpURLConnection) url.openConnection();connection.setRequestMethod("HEAD"); …

用ChatGPT辅助论文写作又怕学术造假?这样用就对了!

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 随着人工智能技术的发展&#xff0c;ChatGPT等语言模型在学术研究中的应用日益广泛。然而&#xff0c;在利用这些工具时&#xff0c;如何避免学术造假成为一个重要问题。学术造假不仅损…

flask、fastapi在服务器制作接口携参访问返回参数

flask创建接口&#xff1a; 一、安装python 官网下载Download Python | Python.org 二、安装flask 在选择的文件夹路径cmd调用bash安装 pip install Flask三、创建flask应用 # app.py from flask import Flask, request, jsonify app Flask(__name__) app.route(/ech…

银行卡快捷支付的应用范围

银行卡快捷支付的应用范围非常广泛&#xff0c;几乎涵盖了现代生活中的各种支付场景。以下是银行卡快捷支付的主要应用范围&#xff1a; 1. 线上购物 在电子商务平台、在线商城或移动应用上&#xff0c;用户可以使用银行卡快捷支付进行在线购物支付。通过选择预先绑定的银行卡…

SQLite Glob 子句

SQLite Glob 子句 SQLite 的 GLOB 子句是一种强大的搜索工具,用于在数据库中执行模式匹配操作。它类似于 SQL 中的 LIKE 子句,但 GLOB 使用的是基于文件系统的通配符,而不是 SQL 的百分比 (%) 和下划线 (_) 通配符。在本文中,我们将详细介绍 SQLite 中的 GLOB 子句,包括其…

Linux服务管理(二)DHCP/FTP服务

DHCP四部曲是指客户机请求IP、服务器响应、客户机选择IP以及服务器确定租约四个步骤的过程。这一系列过程共同构成了DHCP客户机动态获取IP地址的完整流程。下面将详细解读这一过程的每个阶段&#xff1a; 客户机请求IP&#xff1a;也称为DHCPDISCOVER&#xff0c;当一个DHCP客户…

ESXi6.7 update 3主机实现新硬件运行老环境

server 2003 SQL server 2000 SQL SP4 vmware tools 一、适用场景 1、运行多年的老企业&#xff0c;积累的数据量庞大&#xff0c;其中的数据库并不一定都是现在开发的平台或系统&#xff0c;而是已经正在运行&#xff0c;不能停业务的状态。 2、老系统老应用平台&#xf…

IT数据从业人员必读好物——最新发布物开放免费下载!

如今&#xff0c;越来越多的企业开始重视IT在业务中的作用&#xff0c;并寻求通过数字化转型来提升竞争力&#xff0c;且趋向于采用敏捷、灵活的方法来适应快速变化的市场需求。 本月精选发布物&#xff0c;正是为企业的IT管理提供了一个全面的标准化框架&#xff0c;帮助企业系…

如何确保工业展厅设计既专业又吸引?三原则详解!

工业是民族发展的基石&#xff0c;它为我们带来了无数的便利和进步&#xff0c;而为了让更多人了解这个至关重要的产业&#xff0c;以及其背后的技术和产品&#xff0c;许多工业性质的企业都致力于通过互动投影、虚拟现实、全息投影等多媒体技术&#xff0c;来打造独具特色的工…

vue-virtual-scroller-展示大量数据列表-虚拟列表展示优化

安装 -演示 npm i vue-virtual-scrolleryarn add vue-virtual-scrollervue-virtual-scroller 是一个 Vue 组件库,用于高效地渲染大量数据项,通过虚拟滚动来提升性能。它适用于长列表、网格、表格等场景 引入组件 Vue 项目中引入并注册 vue-virtual-scroller 组件。你可以在全…

@金融安全专业人士和风险管理决策者,必读白皮书现开放免费下载!

加快建设金融强国&#xff0c;是中国经济长远发展的战略抉择&#xff0c;更是在经济全球化进程中维护国际金融安全的重要举措&#xff0c;而防控金融风险是建设金融强国的重要保障。 本月最新发布物&#xff0c;聚焦「安全」主题&#xff0c;尤其为金融行业的安全专家&#xff…

除了伦敦外,英国还有这些热门留学城市

在同学们选择出国留学时&#xff0c;首先要考虑到的便是择校的问题。除了排名、专业、录取要求之外&#xff0c;城市因素也占据了很大比重。 抛开学校自身的优势外&#xff0c;一座城市的氛围、成本、环境都是需要考虑的因素。下面就我们来盘点一下英国热门的留学城市。 爱丁…

Google Hacking

1 需求 2 语法 3 目录索引页面 intitle:index intitle:of intitle:/ site:com.cn "Google hacking" 或 "Google dorking" 指的是使用特定的搜索查询技巧来发现互联网上可能的安全漏洞或敏感信息。当你想要检索那些可能泄露了文件目录结构的网站时,你可以…

『C++成长记』string模拟实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 &#x1f4d2;2.1构造函数 &#x1f4d2;2.…

尚品汇-(十二)

&#xff08;1&#xff09;数据库表结构 根据以上的需求&#xff0c;以此将SKU关联的数据库表结构设计为如下&#xff1a; base_attr_value&#xff1a;前面学的平台属性值表 我们进行关联&#xff0c;可以从分类导向平台&#xff0c;通过平台过滤商品 &#xff08;2&#xf…

ubuntu 24手动编译nginx源码及添加对ip地址过滤的支持

本文参考了csdn这位博主的文章并修改整理&#xff1a; https://blog.csdn.net/qq_32262243/article/details/133951973 还是腾讯云ubuntu 24系统&#xff0c;我这里并没有手动下载pcre等源码&#xff0c;直接用ubuntu自带的就可以了&#xff0c;也不需要手动编译openssl等。 …

MySQL—统计函数和数学函数以及GROUP BY配合HAVING

合计/统计函数 count -- 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生&#xff1f; SELECT COUNT(*) FROM student -- 统计数学成绩大于 90 的学生有多少个&#xff1f; SELECT COUNT(*) FROM student WHERE math > 90 -- 统计总分大于 250 的人数有多少&…

【SpringCloud应用框架】Nacos命名空间、分组和DataID三者关系

第五章 Spring Cloud Alibaba Nacos之命名空间、分组和DataID三者关系 文章目录 一、名词解释三者关系 二、切换不同环境DataID方案Group方案Namespace空间方案 一、名词解释 命名空间&#xff08;Namespace&#xff09; ​用于进行租户粒度的配置隔离。不同的命名空间下&…

GraphRAG

什么是RAG&#xff1f; RAG 是一种自然语言查询方法&#xff0c;用于通过外部知识增强现有的LLM&#xff0c;因此如果问题需要特定知识&#xff0c;问题的答案会更相关。它包括一个检索信息组件&#xff0c;用于从外部源获取附加信息&#xff0c;也称为“基础上下文”&#xf…