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,一经查实,立即删除!

相关文章

用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…

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…

『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…

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…

pnpm介绍

PNPM 是一个 JavaScript 包管理器&#xff0c;类似于 npm 和 Yarn。它的全称是 "Performant npm"&#xff0c;主要设计目标是优化包的安装和管理过程&#xff0c;以提升速度和效率。PNPM 的主要特点包括&#xff1a; 符号链接&#xff08;Symlink&#xff09;&#x…

AI产品经理发展与规划

今天引用高飞老师的讲课内容&#xff0c;分享一下&#xff0c;何为AI产品经理&#xff1f;这个话题不仅仅希望介绍AI产品经理的工作方式等方面的内容&#xff0c;更多的在于讨论未来产品经理这个行业应该如何发展&#xff1f;行业壁垒在何处&#xff1f;如何应对中年危机&#…

名企面试必问30题(二十六)——毕业这么久了,为什么还没有找到工作?

回答一&#xff1a; “毕业后的这段时间&#xff0c;我一直在努力寻找最适合自己发展的岗位。我没有急于随便接受一份工作&#xff0c;而是希望能够进入一个与我的专业技能和职业规划高度匹配的公司。在这个过程中&#xff0c;我不断提升自己的技术能力&#xff0c;学习新的测…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中&#xff0c;比如电子围栏/客流统计等&#xff0c;我们需要手动绘制一些感兴趣&#xff08;Region of Interest&#xff0c;简称ROI&#xff09;区域。 在这里&#xff0c;我们基于Python和PyQt5框架开发了一款桌面应用程序&#xff0c;允许用…

c#类型转换和常见集合类型

目录 1. 整数转换&#xff0c;整数和字符串&#xff0c;字符串和整数之间的转换怎么实现&#xff1f; 2. 日期转换&#xff0c;获取当前日期&#xff0c;字符串转日期&#xff0c;日期转字符串怎么实现&#xff1f; 3. 举例一维、二维、三维数组 4. 需求&#xff1a;有个88…

事务(数据库)

是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;事物会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 create table account(id int auto_increment primary key comment 主键ID,name va…

VPN 的入门介绍

VPN&#xff08;虚拟专用网络&#xff09; 简介 虚拟专用网络&#xff0c;简称虚拟专网&#xff08;VPN&#xff09;&#xff0c;其主要功能是在公用网络上建立专用网络&#xff0c;进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…