【SpringMVC】异常处理

news2024/11/19 22:40:39

目录
一、基本介绍
二、局部异常
三、全局异常
四、自定义异常
五、统一处理异常
六、异常处理流程


相关文章(可以关注我的SpringMVC专栏)

SpingMVC专栏SpingMVC专栏

一、基本介绍

 如果我们对异常不做任何处理的话,那么他就会返回500错误,直接回显到前端页面,如下图:
在这里插入图片描述
这种提示方式无疑是很不友好的,所以SpringMVC提供了一种异常处理方式:

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

二、局部异常

 局部异常处理就是只会处理当前Handler里边出现的异常。

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/12/1
  Time: 11:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试异常类</title>
</head>
<body>
<h1>测试异常类</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">测试局部异常处理</a>
</body>
</html>

后端

package com.jl.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: MyExceptionHandler
 * Package: com.jl.web.exception
 * Description: SpringMVC异常处理演示
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:07
 * @Version: v1.0
 */
@Controller
public class MyExceptionHandler {
    /**
     * 编写方法,模拟一场。
     * 如果我们不处理异常,模拟的是Tomcat来处理,页面不友好
     * 所以需要我们来处理异常
     * @param num
     * @return
     */
    @RequestMapping(value = "/testException01")
    public String test(Integer num){
        int i = 9/num;
        return "success";
    }

    /**
     * 该方法用来处理局部异常的
     * Exception exception: 生成的异常会传递给我们的exception对象
     * @return
     */
    @ExceptionHandler({ArithmeticException.class,NullPointerException.class,AgeException.class})
    public String test01(Exception exception, HttpServletRequest request){
        System.out.println("异常信息是:" + exception.getMessage());
        // 将异常携带到下一个页面
        request.setAttribute("reason",exception.getMessage());
        return "exception_msg";
    }
}

测试结果

在这里插入图片描述
这种错误回显效果明显更加的友好。

三、全局异常

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/12/1
  Time: 11:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试异常类</title>
</head>
<body>
<h1>测试异常类</h1>
<a href="<%=request.getContextPath()%>/testGlobalException">测试全局异常处理</a>
</body>
</html>

后端

package com.jl.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: MyGlobalException
 * Package: com.jl.web.exception
 * Description: 全局异常处理的演示
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:28
 * @Version: v1.0
 */

/**
 * 如果一个类上标注了 @ControllerAdvice ,那这个类就是一个全局异常处理类
 */
@ControllerAdvice
public class MyGlobalException {
    /**
     * 全局异常是:不管你是Handler抛出的异常,他都会去捕获处理
     * @return
     */
    @ExceptionHandler({NumberFormatException.class,ClassCastException.class})
    public String globalException(Exception exception, HttpServletRequest request){
        System.out.println("全局异常处理:" + exception);
        request.setAttribute("reason",exception.getMessage());
        return "exception_msg";
    }
}
package com.jl.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: MyExceptionHandler
 * Package: com.jl.web.exception
 * Description: SpringMVC异常处理演示
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:07
 * @Version: v1.0
 */
@Controller
public class MyExceptionHandler {
    /**
     * 编写方法,模拟一场。
     * 如果我们不处理异常,模拟的是Tomcat来处理,页面不友好
     * 所以需要我们来处理异常
     * @param num
     * @return
     */
    @RequestMapping(value = "/testException01")
    public String test(Integer num){
        int i = 9/num;
        return "success";
    }

    // 测试全局异常
    @RequestMapping(value = "/testGlobalException")
    public String global(){
        // 模拟抛出NumberFormatException异常
        // 该异常没有在局部异常处理,他就会交给全局异常处理。
        int num = Integer.parseInt("hello");
        return "success";
    }
}

测试结果

在这里插入图片描述

错误跳转页面

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/12/1
  Time: 16:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数值越界异常处理页面</title>
</head>
<body>
<h1>抱歉。数组越界异常</h1>
</body>
</html>

四、自定义异常

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/12/1
  Time: 11:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试异常类</title>
</head>
<body>
<h1>测试异常类</h1>
<a href="<%=request.getContextPath()%>/testException02">测试自定义异常处理</a>
</body>
</html>

后端

package com.jl.web.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * ClassName: AgeException
 * Package: com.jl.web.exception
 * Description: 自定义异常类
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:54
 * @Version: v1.0
 */

/**
 * reason是我们返回错误页面,默认显示的信息。
 * value 是返回的状态码
 */
@ResponseStatus(reason = "年龄需要在1-150之间", value = HttpStatus.BAD_GATEWAY)
public class AgeException extends Exception{
    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}
package com.jl.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: MyExceptionHandler
 * Package: com.jl.web.exception
 * Description: SpringMVC异常处理演示
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:07
 * @Version: v1.0
 */
@Controller
public class MyExceptionHandler {
    /**
     * 编写方法,模拟一场。
     * 如果我们不处理异常,模拟的是Tomcat来处理,页面不友好
     * 所以需要我们来处理异常
     * @param num
     * @return
     */
    @RequestMapping(value = "/testException01")
    public String test(Integer num){
        int i = 9/num;
        return "success";
    }

    // 测试自定义异常
    @RequestMapping(value = "/testException02")
    public String test02() throws AgeException {
        throw new AgeException("年龄必须要在1-150之间");
    }
}

测试结果

在这里插入图片描述

五、统一处理异常

 这种异常处理方式,是我们需要对所有异常进行统一处理的时候,可以使用SimpleMappingExceptionResolver。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。这种方式需要在SpringMVC配置文件中进行配置。

<!--
   配置统一异常处理类
   1. SimpleMappingExceptionResolver 异常解析器
   2. key="java.lang.ArrayIndexOutOfBoundsException" 异常类
   3. arrEx:指定的处理异常之后跳转的页面
   4. <prop key="java.lang.Exception">arrEx</prop> 我们可以使用Exception来捕获未知的异常
   5. 异常的处理顺序:局部异常 > 全局异常 > SimpleMappingExceptionResolver > Tomcat默认的异常处理
-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
   <property name="exceptionMappings">
       <props>
           <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
           <prop key="java.lang.Exception">arrEx</prop>
       </props>
   </property>
</bean>

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/12/1
  Time: 11:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试异常类</title>
</head>
<body>
<h1>测试异常类</h1>
<a href="<%=request.getContextPath()%>/testException03">测试统一异常处理</a>
</body>
</html>

后端

package com.jl.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: MyExceptionHandler
 * Package: com.jl.web.exception
 * Description: SpringMVC异常处理演示
 *
 * @Author: Long
 * @Create: 2022/12/1 - 11:07
 * @Version: v1.0
 */
@Controller
public class MyExceptionHandler {
    /**
     * 编写方法,模拟一场。
     * 如果我们不处理异常,模拟的是Tomcat来处理,页面不友好
     * 所以需要我们来处理异常
     * @param num
     * @return
     */
    @RequestMapping(value = "/testException01")
    public String test(Integer num){
        int i = 9/num;
        return "success";
    }

    // 统一处理异常测试
    @RequestMapping(value = "/testException03")
    public String test03(){
        int[] nums = new int[]{1,2,3};
        System.out.println(nums[5]);
        return "success";
    }
}

测试结果

在这里插入图片描述

 异常处理的优先级:
局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat 默认机制

六、异常处理流程

在这里插入图片描述

如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

list底层实现

目录 引言 结构形式 整体框架 插入删除接口实现 析构函数、拷贝构造、赋值重载 const迭代器实现 取得链表长度的方式 迭代器前置\后置operator -- 以及operator-> 引言 list是非常常用的一个容器&#xff0c;数据结构是链表&#xff0c;数据空间是以链式结构存储的…

QT中控件不满足要求那么为你的控件做“提升”吧

我们在VisualStudio中例如VC或者C#中写一些个性化比较强的项目都会对控件有更高的要求&#xff0c;那么当我们的要求得不到满足时就需要考虑用到自定义控件了&#xff0c;其中自定义控件有两种方式&#xff0c;一种是完全重写&#xff0c;另一种简单的方法是继承自现有的控件。…

指针深度解剖,从内存详细了解指针

目录 &#x1f695;第一组&#xff1a;一维数组 &#x1f68c;第二组&#xff1a;字符数组 &#x1f690;字符数组1.0 &#x1f68e;字符数组1.1 &#x1f691;字符数组2 &#x1f69a;字符数组3 &#x1f69c;第三组&#xff1a;二维数组 &#x1f697;在上次的博客之中我们…

INVS里的DanglingWire的自动化清理实战

在上一讲中一起了解了INVS里的DanglingWire&#xff08;innovus中的DanglingWire&#xff08;悬垂线&#xff09;的理解和处理&#xff09;&#xff0c;常言道理论联系实际&#xff0c;在理解原理的基础上&#xff0c;那一定是要服务项目的&#xff0c;这篇后续火速跟进&#x…

中国第一个 Apache 顶级开源项目的突围之路!

【CSDN 编者按】近些年开源大热&#xff0c;开源创业之风随之四起。作为近两年特别火的商业方向&#xff0c;开源创业者如何才能在一片红海中乘风破浪&#xff0c;在行业中占据一席之地&#xff1f;第一个由中国人主导贡献到 ASF 的顶级开源项目 Apache Kylin 做出了有效探索&a…

字节序,主机字节序与网络字节序

&#x1f4cc;————本章重点————&#x1f4cc; &#x1f517;了解字节序的概念; &#x1f517;了解大小端的概念;&#x1f517;了解主机字节序和网络字节序的区别;&#x1f517;学习主机字节序和网络字节序相机转化的接口; ✨————————————✨字节序 概念&am…

人工智能助力古彝文识别,推动传统文化传承

人工智能助力古彝文识别&#xff0c;推动传统文化传承0. 前言1. 古彝文1.1 古彝文介绍1.2 古彝文识别的重要意义1.3 古彝文识别的挑战2. 古彝文识别国内外研究进展3. 基于深度学习的古彝文识别3.1 深度学习简介3.2 基于深度学习的古彝文识别模型架构4. 古彝文识别进展与展望小结…

HTML小游戏19 —— html5版开心斗地主小游戏(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】本节教程我会带大家使用 HTML…

【练习】Day05

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 跳跃游戏[贪心算法]2. 寻找重复数[注意思路&#xff01;]答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 HASH 函数冲突处理方式不包括以下哪一项&#xff1a;&#xff08;&…

YOLOv5源码详解——项目目录

YOLOv5 目录 .github .github相关&#xff0c;不重要 datasets 存放数据集,刚下载下来的源码是不包含这个文件夹的 classify 图像分类模块&#xff0c;包含以下4个文件 predict.py —— 图像分类预测脚本train.py ——图像分类训练脚本val.py —— 图像分类验证脚本tutorial.…

Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

一、标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBatisPlus入门案例与简介中使用的环境 二、新增 在进行新增之前&#xff0c;我们可以分析下新增的方法…

马蹄集 公式计算

公式计算 难度&#xff1a;青铜 01 时间限制&#xff1a;1秒巴占用内存&#xff1a;64M 计算公式 (1/2)*(a*xc(ac)/(4*a)》 格式 输入格式&#xff1a;输入为整型x,a,空格分隔 #include <bits/stdc.h> using namespace std; int main() {int x, a;cin >> x >&g…

1、JDK17安装

目录 一、简介 二、安装步骤 三、在Windows 10系统中配置环境变量 四、运行jdk 一、简介 JDK全称Java SE Development kit(JDK)&#xff0c;即java标准版开发包&#xff0c;是Oracle提供的一套用于开发java应用程序的开发包&#xff0c;它提供编译&#xff0c;运行java程…

二叉树【数据结构】【超详细,一学就会!!!】

目录 &#x1f4d6;1.什么是二叉树&#xff1f; &#x1f334;2.满二叉树和完全二叉树 ⛳2.二叉树的性质 &#x1f525;3.二叉树的创建与遍历 3.1 创建二叉树 3.2 前中后序遍历——递归和非递归 &#x1f3f9;4.二叉树的实现 1️⃣获取树中节点的个数 2️⃣获取叶子节点…

MATLAB-三维插值运算

MATLAB中是支持三维及三维以上的高维插值的。三维插值的基本原理与一维插值和二维插值是一样的&#xff0c;但三维插值是对三维函数进行的插值。在MATLAB中&#xff0c;使用interp3函数实现插值&#xff0c;其调用格式如下。vi interp3(x,y,z,v,xi,yi,zi) %返回值 vi是三维插值…

2022ICPC杭州站

A. Modulo Ruins the Legend 题目链接&#xff1a;Problem - A - Codeforces 样例1输入&#xff1a; 6 24 1 1 4 5 1 4样例1输出&#xff1a; 1 0 5样例2输入&#xff1a; 7 29 1 9 1 9 8 1 0样例2输出&#xff1a; 0 0 0题意&#xff1a;给你一个长度为n的数组a[]&#x…

【NI Multisim 14.0原理图的设计——原理图分类】

目录 序言 一、原理图的设计 &#x1f34a;知识点&#xff1a; 二、原理图分类 &#x1f349;1.平坦式电路 &#x1f349; 2.层次式电路图 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和…

【用JS自制表格软件玩数据】10. 为表格脚本设计一个语法解析器

设计脚本语言的语法解析器概述脚本源码语法预览运行效果如下图设计计算符号的优先级定义一些关键词生成一份关键词的map方便引用枚举关键词的类型错误异常的捕获字符匹配代码的字符转化成迭代器关键词标记器词法分析器设计一个队列处理器源代码字符串迭代器代码的块级运行环境脚…

【HTML基础篇003】前端基础之CSS选择器大全

✨一、CSS的基本介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 ✨二、CSS的几种引入方式 &#x1f338;2.1、方法一&am…

连接查询之内连接(等值连接、非等值连接和自连接)

1、等值连接&#xff1a;表连接条件是等值关系&#xff0c;我们称为等值连接。 需求&#xff1a;查询每个员工所在部门名称&#xff0c;显示员工名和部门名&#xff1a; 查看员工表的ename和deptno字段信息&#xff1a; 查看部门表中的deptno和dname字段信息 SQL92语法&#x…