Spring mvc处理异常

news2024/11/28 8:28:24

文章目录

    • 一、Handler ExceptionResolver处理异常
    • 二、@ExceptionHandler注解
    • 三、重点:添加@ExceptionHandler注解方法的形参只能是异常类型
    • 四、重点2:捕获所有方法的异常—@ControllerAdvice注解
    • 五、总结
    • 六、ResponseStatusExceptionResolve自定义异常显示页面
    • 七、扩展@ResponseStatus 用法
    • 八、其他异常处理
      • 8.1 DefaultHandlerExceptionResolver
      • 8.2 SymbolMappingExceptionResolver

一、Handler ExceptionResolver处理异常

Spring mvc处理异常的是顶级接口Handler ExceptionResolver
看一下该接口的源码所在的包
在这里插入图片描述
在这里插入图片描述
可以看到HandlerExceptionResolver接口在spring-webmvc包下
来看一下这个接口的实现类
在这里插入图片描述
上面每一个实现类都对应一种异常的处理方式
,重点来看ExceptionHandlerExceptionResolver

二、@ExceptionHandler注解

在这里插入图片描述
ExceptionHandlerExceptionResolver主要提供了
@ExceptionHandler 注解
通过在方法上添加该注解来实现异常处理
在Controller层写个异常
在这里插入图片描述
如图所示,这行代码会报ArithmeticException算术异常,以前我们可以使用try catch来处理,现在把try catch注释掉,再写一个方法HandlerArithmeticException(),并使用注解的形式来捕获异常,如下

在这里插入图片描述
添加@ExceptionHandler注解的这个方法就可以捕获本类中的异常,想要捕获指定的异常,就在注解后面添加参数,
上面我添加的是算数异常ArithmeticException.class因此,当前的这个方法就可以捕获上面的算术异常。代码如下

public String testExceptionHandler(){
//try {
    System.out.println( 1/0 );
//}catch(ArithmeticException e) e
    return "success";
}
//该方法可以捕获本类中抛出的ArithmeticException异常
@ExceptionHandler({ArithmeticException.class})
public String handlerArithmeticException(ArithmeticException e){
    System.out.println(e);
    return "error";
}

下面再写一个数组越界异常:
ArrayIndexOutOfBoundsException
用同一个方法捕获,只要在@HandlerException注解后面追加要捕获的异常的类名就可以

public String testExceptionHandler2(){
     int[] nums = new int[2];
     System.out.println(nums[2]);//ArrayIndexOutOfBoundsException
     return "success";
 }
//该方法可以捕获本类中抛出的ArithmeticException异常以及ArrayIndexOutOfBoundsException异常
@ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class})
public String handlerArithmeticException(Exception e){
     System.out.println(e)
     return "error";
}

三、重点:添加@ExceptionHandler注解方法的形参只能是异常类型

在这里插入图片描述
上面的handlerArithmeticException()方法的形参不能包含其他的,只能包含Exception e这一个
,总结一下,就是有@ExceptionHandler注解的方法的形参只能是异常类型的,而且只能有这个。

异常类型🈯️Throwable及其子类

//该方法可以捕获本类中抛出的ArithmeticException异常
@ExceptionHandler({ArithmeticException.class,ArrayIndexOutofBounds.class})
public ModelAndView handlerArithmeticException(Exception e){
   ModelAndView mv = new ModelAndView("error");//设置跳转的路径,error.jsp页面,前端调度器会自动添加"/",".jsp"
   System.out.println(e):
   mv.addobject("er", e);
   return mv;
}

上面的方法使用ModelAndView做跳转

四、重点2:捕获所有方法的异常—@ControllerAdvice注解

@ExceptionHandler注解默认只能处理本类中的异常,但是在实际应用中,发生异常的方法和处理异常的方法不会在同一个类中。
我们需要写一个单独用来处理异常的类
例如:MyExceptionHandler类
添加@ControllerAdvice注解,添加该注解的类,可以捕获所有方法的异常

import org.springframework.Web.bind.annotation.ControlierAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class MyExceptionHandler{
//不是控制器,仅仅是用于处理异常的类
@ExceptionHandler({Exception.class })
public ModelAndView handlerArithmeticException2(Exception e){
   ModelAndView mv = new ModelAndView("error");
   System.out.println(e+"a====="+"该@ControllerAdvice中的异常处理方法")
   mv.addobject("er", e);
   return mv;
}

五、总结

如果是只处理当前类方法中的异常,那就在使用@ExceptionHandler注解
在这里插入图片描述

如果想处理所有方法的异常,要在类前面加@ControllerAdvice,并且在处理异常的类前
添加@ExceptionHandler
在这里插入图片描述

六、ResponseStatusExceptionResolve自定义异常显示页面

我们平常异常页面404如图在这里插入图片描述
现在来自定义该页面:
通过ResponseStatusExceptionResolver类,
该类主要提供了@ResponseStatus注解,通过在类上面添加注解来定义异常处理页面,源码如下:
在这里插入图片描述
@ResponseStatus注解使用如下
在自定义的类MyArrayIndexOutofBoundsException上添加
在这里插入图片描述
填写value值先来了解HttpStatus,源码如下,可以看到是枚举类型
在这里插入图片描述
下面是HttpStatus部分定义:
在这里插入图片描述
403是页面禁止访问:Forbidden
404是找不到:Not Found
返回MyArrayIndexOutofBoundsException类来写一个403
在这里插入图片描述
可以写value值等于403也可以用HttpStatus.FORBIDDEN
在这里插入图片描述
上面两种写法意义相同

接下来定义reason,如果有方法的抛出异常MyArrayIndexOutofBoundsException,则报403错误,中文显示就是reason定义的内容:数组越界222!!!
在这里插入图片描述
最后一步
当前自定义的类继承Exception类
在这里插入图片描述
现在自定义的异常处理页面就写好了就写好了^O^/

定义一个会报异常的的方法,测试一下,刚刚自定义的异常处理页面
在这里插入图片描述
如果前端发来的请求中i=3,就抛出异常
MyArrayIndexOutofBoundsException
tomcat运行,访问上面那个方法,请求路径上传参用?连接i=3

在这里插入图片描述
运行结果:可以看到自定义定义的reason:数组越界222!!!在这里插入图片描述

七、扩展@ResponseStatus 用法

定义testMyException2()方法
如果前端传来的值i=3
return “testResponseStatus”;
该返回值直接请求当前类中定义的另一个方法testResponseStatus(),注意是请求当前类中的方法!!且该方法:@RequestMapping(“testResponseStatus”),与上面返回值对应
如下图示:
在这里插入图片描述
我们在testResponseStatus()方法上面添加注解@ResponseStatute
在这里插入图片描述
完整代码如上,现在运行测试,
访问/testMyException2?i=3
在这里插入图片描述
运行报错,没有找到textResponseStatus.jsp页面 在这里插入图片描述
这里是因为前端调度器,会自动为返回值添加前缀“/”和后缀“.jsp”,
想要正确访问,需要使用redirect跳转
如下图所示
在这里插入图片描述
Springmvc传值和跳转可以看这篇:
Spring mvc传值和跳转

@RequestMapping("testMyException2")
public String testMyException2(@RequestParam("i") Integeri){
    if(i == 3){
      return "redirect:testResponseStatus”;//跳转到某一个异常处理方法里
      return "success";
}
@ResponseStatus(value=HttpStatus.COWFLICT ,reason="测试。。。”)
@RequestMapping("testResponseStatus")
public String testResponseStatus(){
    return "success";

再次运行访问路径
/testMyException2?i=3
运行结果如下:
在这里插入图片描述
异常页面和定义的一致
在这里插入图片描述
总结:
@ResponseStatus注解可以写在方法前,也可以写在类前。

异常解析:Spring mvc异常解析器与拦截器

八、其他异常处理

8.1 DefaultHandlerExceptionResolver

也是Spring mvc处理异常的是顶级接口Handler ExceptionResolver的实现类
在这里插入图片描述
这是一个默认处理
就是你不用写,如果有报错,会默认跳转到异常处理页面,如下所示
在这里插入图片描述
现在来浏览器输入
localhost:8888/SpringMVCProject/handler/welcome2
(又重新写了一个welcome5方法,所以下面截图中访问的是方法5)
在这里插入图片描述
可以看到异常显示页面405。

异常处理的实现类:
DefaultHandlerExceptionResolver
SPringMVC在常见异常的基础上(300 500 404),新增了一些异常,例如405—Method not Allowed,
部分源码如下:

在这里插入图片描述

*@see org. springframework. weh. servlet. mvc. method. annotation. ResponseEntityExceptioniandler
*@see #handleNoSuchRequestHandlingMethod
*@see #handleHttpRequestMethodNotSupported
*@see #handleHttpMediaTypeNotSupported
*@see #handleMissingServletRequestParameter
*@see #handleServletRequestBindingException
*@see #handleTypeMismatch
*@see #handleHttpMessageNotReadable
*@see #handleHttpMessageNotWritable
*@see #handleMethodArgumentNotValidException
*@see #handleMissingServletRequestParameter
*@see #handleMissingServletRequestPartException
*@see #handleBindException

8.2 SymbolMappingExceptionResolver

也是Spring mvc处理异常的是顶级接口Handler ExceptionResolver的实现类
在这里插入图片描述
SymbolMappingExceptionResolver通过配置实现处理异常

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

<!-- SimpleMappingExceptionResolver:以配置的方式处理异常-->
<bean class="org.springframework.web.servlet.handler.SimpleMappinge">
   <property name="exceptionMappings">
        <props>
            <!--相当于catch(ArithmeticException e){ 跳转:error.jsp-->
            <prop key="java.lang.ArithmeticException">
               error
            </prop>
        </props>
    </property>
</bean>

props标签中可以添加多个prop,再写一个空指针异常,如果异常,就跳转到error.jsp

<!-- SimpleMappingExceptionResolver:以配置的方式处理异常-->

<bean class="org.springframework.web.servlet.handler. SimpleMappingException">
     <property name="exceptionAttribute" value="ex"></property>
     <property name="exceptionMappings">
         <props>
             <!--相当于catch(ArithmeticException ex){跳转:error}--> 
             <prop key="java.lang.ArithmeticException">
                 error
             </prop>
             <prop key="java.lang.NullPointerException">
                 error
             </prop>
         </props>
     </property>
</bean>

以下代码,如果捕获到异常会,异常对象会保存在exceptionAttribute的value值:ex中,并且会被放到request作用域中

<property name="exceptionAttribute" value="ex"></property>

不管捕获到的是算数异常或空指针异常,都可以通过${requestScope.ex}取值
在这里插入图片描述
以下error.jsp页面代码

<%@ page language="jdva" contentType="text/html; charset=UTF-8'
pageEncoding="UTF-8"%>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
   <title>Insert title here</title>
</head>
<body>
    error.jsp..<br/>
    ${requestScope.ex}
</body>

</html>

如果不写这行代码

<property name="exceptionAttribute" value="ex"></property>

也可以,默认exceptionAttribute的value值是exception
可以通过
${requestScope.exception}取值

tomcat运行,访问下面这个方法的算术异常在这里插入图片描述
结果如下,跳转到error.jsp页面
在这里插入图片描述
通过${requestScope.exception}取值—>算术异常

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

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

相关文章

[go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目

一.基本介绍 1.项目开发流程说明 2.项目需求说明 目标: 模拟实现一个基于文本界面的<<家庭记账软件>> 掌握初步的编程技巧和调试技巧 主要涉及以下知识点 : (1).局部变量和基本数据类型 (2).循环语句 (3).分支语句 (4).简单的屏幕输出格式控制 (5).进阶&#xff1…

刷题日记【第九篇】-笔试必刷题【杨辉三角的变形+计算某字符出现的次数+字符串通配符+统计每个月兔子的总数】

下列sql语句中哪条语句可为用户zhangsan分配数据库userdb表userinfo的查询和插入数据权限&#xff08;A&#xff09;。 常用的管理权限的命令为&#xff1a; grant select/insert/update/delete on 数据库名.表名 to 用户名‘该用户允许访问的ip’ 在oracle中&#xff0c;下面哪…

世界上只有一种共识算法,那就是Paxos

分布式系统原理系列目录 分布式系统的麻烦副本与一致性为什么需要一个分布式共识算法世界上只有一种共识算法&#xff0c;那就是PaxosCAP定理&#xff0c;说起来一句话&#xff0c;实际坑不少BASE&#xff0c;可用性高于强一致性分布式事务方案那么多&#xff0c;到底该选哪一…

计算机毕业设计(附源码)python智慧灭火器管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

大数据学习3.1 Hadoop环境准备

Hadoop环境Hadoop集群拓扑1、集群拓扑2、角色分配一、虚拟机安装二、虚拟机克隆1、克隆类型&#xff08;1&#xff09;完整克隆&#xff08;2&#xff09;链接克隆2、克隆步骤&#xff08;1&#xff09;克隆出master虚拟机&#xff08;2&#xff09;克隆出slave1虚拟机&#xf…

深入理解Linux文件描述符

>> Linux基础IO系列文章 1. Linux文件操作系统接口的学习使用 一、前言 在上一篇博客中&#xff0c;我们初步学习了Linux文件操作的系统接口&#xff0c;不难发现的是&#xff0c;这些系统函数都与文件描述符密切相关&#xff1a;open函数返回值是一个文件描述符&#…

Python编程挑战赛

题1&#xff1a;给小朋友分糖&#xff0c;每人分到糖的数量不同&#xff0c;输入小朋友的数量&#xff0c;计算至少需要多少糖&#xff1f; 思路&#xff1a;第1个小朋友1颗糖&#xff0c;第2个小朋友2颗糖&#xff0c;第3个小朋友3颗糖&#xff0c;……第n个小朋友n颗糖&#…

[数据结构]实现双向链表

作者&#xff1a; 华丞臧. 专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 文章目录一、带头双向循环链表二、带头双向循环链表接口实现2.1 双向链表的初始化、打…

动态规划算法的题到底应该怎么做?思路教给你自己写

本文是我通过做题和借鉴一些前人总结的套路而得出的思路和方法&#xff0c;刚好这次CSDN第八周的周赛上出了三道动态规划的题目&#xff0c;我会结合题目对我的思路进行一个输出&#xff0c;会从最简单的一维dp开始讲解到二维dp&#xff0c;希望对你有帮助&#xff0c;有错误希…

MySQL数据库基础知识

今天是更新数据库的第一篇&#xff0c;关于数据库环境搭建问题博主先不在这里介绍了&#xff0c;博主今天是直接讲知识了&#xff0c;等以后的博客&#xff0c;博主再更新数据库搭建问题。在这里我们使用命令行式客户端&#xff0c;先不使用windows下的图形化界面&#xff0c;使…

ReadingTime-十一月

CV文章浅读_not_everday0x1105.CAViT for video object re-id 2022_中科院这个月主要是要学习pytorch和一些CV baseline的复现&#xff0c;搞搞毕设雏形&#x1f199; 以后还是把笔记写纸上要么写博客&#xff0c;不放本地了&#x1f628; 网页版小绿鲸zen好用 &#x1f603; …

峰会实录 | 基于StarRocks和腾讯云EMR构建云上Lakehouse

作者&#xff1a;腾讯云EMR业务负责人陈龙&#xff08;本文为作者在 StarRocks Summit Asia 2022 上的分享&#xff09; 我目前负责腾讯云EMR 的研发工作&#xff0c;此前先后在百度、支付宝做后端研发。2011年加入腾讯&#xff0c;先后参与了腾讯云Redis、腾讯云云数据库、Ap…

小米 Civi 2 (ziyi) 机型解锁bl 获取root权限教程 +其他机型参数对比+救砖

*********机型优点与其他机型参数对比***************** 小米 Civi 2 (ziyi) 国行版机型前置由3200万主摄3200万超广角组成的双摄是它最大的亮点&#xff0c;配有4颗柔光灯。自拍相当不错。他的后置主摄采用5000万像素相机&#xff0c;IMX766传感器&#xff0c;1/1.56英寸感光…

【MybatisPlus】CRUD操作,映射匹配兼容性,ID生成策略,逻辑删除,乐观锁

文章目录MybatisPlus简介一、数据层基本的开发1. 引入jar包2. 配置数据源3. 编写实体类4. 创建Dao接口5. 测试二、CRUD使用1. 查询2. 添加3. 删除4. 修改5. 分页查询三、条件查询1. 条件查询的方式2. 多条件查询四、映射匹配兼容性1. 表字段与编码属性设计不同步2. 编码中添加了…

矩阵理论复习(二)

内积空间的定义 模与内积 向量x和y的夹角 正交向量、正交组和正交矩阵 度量矩阵 基向量内积、度量矩阵、任意向量内积之间的关系 欧式空间的两个基对应的度量矩阵彼此合同 度量矩阵的行列式的几何问题 正交补子空间 内积空间子空间U与U的正交补子空间的直和 …

LeetCode 138. 复制带随机指针的链表

难度 中等 题目链接 示例&#xff1a; 解题思路&#xff1a; 首先&#xff0c;大家肯定会这样想&#xff1a;定义一个cur循环遍历&#xff0c;每次遍历一个&#xff0c;就malloc一个。 当遍历后面的时候&#xff0c;就开始尾插。 但现在有一个问题是&#xff1a;这个random指…

通信直放站基础知识

直放站的定义 直放站&#xff08;中继器&#xff09;属于同频放大设备&#xff0c;是指在无线通信传输过程中起到信号增强的一种无线电发射中转设备。直放站的基本功能就是一个射频信号功率增强器。直放站在下行链路中&#xff0c;由施主天线从现有的覆盖区域中拾取信号&#x…

《嵌入式 - 嵌入式大杂烩》CoreMark性能测试

1 CoreMark简介 CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一项基准测试程序&#xff0c;CoreMark的主要目标是简化操作&#xff0c;并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的Co…

【树莓派不吃灰系列】快速导航

目录1. 通用篇2. Python篇3. 编程IO篇❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-06 ❤️❤️ 本篇更新记录 2022-11-06 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言 &#x1f4dd;&…

Slave_IO_Running: No 的解决

原因&#xff1a; 两台主从数据库的uuid相同了&#xff08;没猜错的话&#xff0c;各位的第二台虚拟机都是克隆了第一台&#xff0c;然后就改了个ip对吧&#xff09;。 解决办法&#xff1a; 必须跟着步骤来&#xff0c;一步也不能多&#xff0c;更不能少&#xff0c;请仔细…