SpringMVC 学习(十)之异常处理

目录

1 异常处理介绍        

2 通过 SimpleMappingExceptionResolver 实现

3 通过接口 HandlerExceptionResolver 实现

4 通过 @ExceptionHandler 注解实现(推荐)


1 异常处理介绍        

        在 SpringMVC中,异常处理器(Exception Handler)用于处理应用程序中发生的异常。SpringMVC 提供的异常处理主要有以下三种方式:

  • 使用 SpringMVC 提供的简单异常处理器 SimpleMappingExceptionResolver
  • 实现异常处理接口 HandlerExceptionResolver
  • 使用 @ExceptionHandler 注解实现异常处理

2 通过 SimpleMappingExceptionResolver 实现

SimpleMappingExceptionResolver 异常处理器是 SpringMVC 定义好的异常处理器,具有以下特点。

  • 优点:集成简单、有良好的扩展性、对已有代码没有入侵性等
  • 缺点:该方法仅能获取到异常信息,对需要获取除异常以外的数据的情况不适用

在 SpingMVC 的配置文件中配置 SimpleMappingExceptionResolver 异常处理器

<!-- 配置异常映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver"><!-- exceptionAttribute属性:设置将异常对象存入请求域时使用的属性名,默认使用"exception"作为属性名 --><property name="exceptionAttribute" value="exception"></property><!-- 用于指定具体的不同类型的异常所对应的异常响应页面。 --><property name="exceptionMappings"><props><!-- key属性:指定异常类型 --><!-- 文本标签体:指定和异常对应的逻辑视图名称 --><!-- 根据异常类型进行精确匹配,子类异常类型不匹配,才匹配父类异常类型 --><prop key="java.lang.ArithmeticException">show-message</prop><prop key="java.lang.RuntimeException">show-runtime-message</prop><prop key="java.lang.Exception">show-exception-message</prop></props></property><!-- 指定默认的异常响应页面。若发生的异常不是exceptionMappings中指定的异常,则使用默认异常响应页面。 --><property name="defaultErrorView" value="error"></property>
</bean>

模拟异常的控制方法

@Controller
public class ExceptionController {@RequestMapping("/exception")public void test() {// 触发 ArithmeticException 异常int result = 1 / 0;}
}

show-message.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>异常信息页面</title></head><body><h1>系统信息</h1>异常对象:${requestScope.exception}<br/>异常消息:${requestScope.exception.message}<br/></body>
</html>

执行结果

3 通过接口 HandlerExceptionResolver 实现

自定义异常处理器类

public class CustomExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {// 处理异常的逻辑// 可以设置错误视图、返回错误代码、记录异常信息等ModelAndView modelAndView = new ModelAndView("show-message");modelAndView.addObject("exception", ex);return modelAndView;}
}

在 SpringMVC 配置文件中配置异常处理器

<bean class="com.controller.CustomExceptionHandler"></bean>

奇怪了,Exception exception 有 getMessage() 方法,没有 exception.message,结果没报错

4 通过 @ExceptionHandler 注解实现(推荐)

@ControllerAdvice 注解是 Spring Framework 中的一个注解,用于标识一个类为全局的控制器 advice (控制器增强)
使用 @ControllerAdvice 注解的类可以提供以下功能:

  • 全局异常处理:可以使用 @ExceptionHandler 注解在 @ControllerAdvice 类中定义异常处理方法,以处理控制器中抛出的异常。这些方法可以捕获特定的异常类型,并返回相应的响应,如错误页面或错误信息
  • 全局数据验证:可以使用 @InitBinder 注解在 @ControllerAdvice 类中定义数据绑定初始化方法,以在请求处理之前对参数进行验证或自定义数据绑定规则
  • 全局拦截器:可以使用 @Interceptor 注解在 @ControllerAdvice 类中定义拦截器方法,以拦截所有控制器方法的调用,并在调用之前或之后执行额外的操作,如日志记录、权限检查等
  • 统一响应处理:可以使用 @ResponseBody 注解在 @ControllerAdvice 类中定义响应处理方法,以统一处理控制器方法的返回值,并将其转换为合适的响应格式,如 JSON 或 HTML

注:使用 @ExceptionHandler 注解在 @Controller 类中定义的异常处理方法,只能作用于该类,无法处理全局异常。

// 这个注解表示当前类是一个异常映射类
@ControllerAdvice
public class MyException {// 在@ExceptionHandler注解中指定异常类型@ExceptionHandler(value = {RuntimeException.class, ArithmeticException.class})public ModelAndView exceptionMapping(Exception exception) {// 方法形参位置接收SpringMVC捕获到的异常对象// 可以将异常对象存入模型;将展示异常信息的视图设置为逻辑视图名称ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("exception", exception);modelAndView.setViewName("show-message");// 打印一下信息System.out.println(exception.getMessage());return modelAndView;}
}

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

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

相关文章

CGI程序与ShellShock漏洞

CGI是什么&#xff1f; CGI&#xff08;通用网关接口&#xff0c;Common Gateway Interface&#xff09;程序是一种用于在Web服务器上执行动态内容的技术。与服务器上普通的后端代码相比&#xff0c;CGI程序有几个区别&#xff1a; 执行环境&#xff1a; CGI程序在服务器上作为…

Gradio Dataframe 学习笔记

Gradio Dataframe 学习笔记 0. 简介1. 使用场景2. 测试数据3. 学习代码4. 更多功能5. 学习资源6. 总结 0. 简介 Gradio是一个用于构建交互式机器学习界面的Python库。它可以轻松创建各种类型的界面&#xff0c;包括用于数据可视化和探索的界面。 Gradio Dataframe 组件是 Gra…

大数据分析师常用函数

常用函数 当进行大数据分析时,SQL中的函数非常丰富,以下是更详细的展开: 窗口函数 (Window Functions): ROW_NUMBER(): 为结果集中的每一行分配一个唯一的整数,用于排序。RANK(): 为结果集中的每一行分配一个排名,相同值会有相同的排名,但会跳过相同排名数量。DENSE_RAN…

处理异常(Exception)

1、什么是异常 在实际工作中&#xff0c;我们遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的要求&#xff1b;你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff1b;你要读取数据库的数据&am…

2024牛客寒假算法基础集训营1(补题)

文章目录 ABCDEFGHIJKL A n的范围很小暴力直接 O ( n 3 ) O(n^3) O(n3)直接做就行。 我还傻的统计了一下前后缀&#xff0c;不过怎么写都行这道题。 #include <bits/stdc.h> #define int long long #define rep(i,a,b) for(int i (a); i < (b); i) #define fep(i,…

【appium】App类型、页面元素|UiAutomator与appium|App元素定位

目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局&#xff1a; 常见控件&#xff1a;定位软件&#xff1a;appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…

【Java EE初阶二十六】简单的表白墙(二)

2. 后端服务器部分 2.1 服务器分析 2.2 代码编写 2.2.2 前端发起一个ajax请求 2.2.3 服务器读取上述请求,并计算出响应 服务器需要使用 jackson 读取到前端这里的数据,并且进行解析&#xff1a; 代码运行图&#xff1a; 2.2.4 回到前端代码&#xff0c;处理服务器返回的响应…

springboot/ssm宠物领养救助平台Java流浪动物救助管理系统web

springboot/ssm宠物领养救助平台Java流浪动物救助管理系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;…

from tensorflow.keras.layers import Dense,Flatten,Input报错无法引用

from tensorflow.keras.layers import Dense,Flatten,Input 打印一下路径&#xff1a; import tensorflow as tf import keras print(tf.__path__) print(keras.__path__) [E:\\开发工具\\pythonProject\\studyLL\\venv\\lib\\site-packages\\keras\\api\\_v2, E:\\开发工具\\…

经典逻辑题--鞋子的颜色

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b;欢迎加入AI架构师论坛 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心…

02点亮一个LED

书接上回 上回讲到创建一个示例工程 今天讲如何实现LED的点亮 点亮一个led 所需代码 参考来源网络 延时函数参考&#xff1a; Delay.c #include "stm32f10x.h"/*** brief 微秒级延时* param xus 延时时长&#xff0c;范围&#xff1a;0~233015* retval 无*/ vo…

Python 实现Excel自动化办公(下)

上一讲我们讲到了Python 针对Excel 里面的特殊数据处理以及各种数据统计&#xff0c;本讲我们将引入Pandas 这个第三方库来实现数据的统计&#xff0c;只要一个方法就可以统计到上一讲的数据统计内容&#xff0c;本讲也会扩展讲讲Pandas所涉及到的相关使用方法。 统计输出 imp…

Python 实现 ROC指标计算(变动率指标):股票技术分析的利器系列(15)

Python 实现 ROC指标计算(变动率指标&#xff09;&#xff1a;股票技术分析的利器系列&#xff08;15&#xff09; 介绍算法公式 代码rolling函数介绍核心代码计算OSC 完整代码 介绍 ROC&#xff08;变动率指标&#xff09;是一种技术分析指标&#xff0c;用于衡量价格变动的速…

windows系统使用Vscode在WSL调试golang本地进程

背景&#xff1a; windows10企业版 vscodegolang1.20 wsl编译运行。 vscode 使用本地wsl进行进程attach操作&#xff0c;发现&#xff1a;Access is denied. 本地进程启动&#xff0c;vscode调试进程。windows-Linux控制台: Starting: C:\Users\book\go\bin\dlv.exe dap --l…

Ubuntu Mysql Innodb cluster集群搭建+MaxScale负载均衡(读写分离)

Ubuntu系统版本 20.04.3 LTS (Focal Fossa) 、64位系统。 cat /etc/os-release查看Ubuntu系统是32位还是64位 uname -m如果显示“i686”,则表示安装了32位操作系统。如果显示“x86_64”,则表示安装了64位操作系统。 一、安装MySql 参考: https://blog.csdn.net/qq_3712…

什么是去中心化云计算?

去中心化云计算是一种新型的云计算方式&#xff0c;它与传统的中心化云计算不同&#xff0c;将数据和计算任务分布到多个节点上&#xff0c;而不是将数据集中存储在中心服务器上。这种云计算方式具有许多优势&#xff0c;包括提高数据安全性、降低运营成本、增强可扩展性和灵活…

.NET Core Web API 之SignalR

SignalR是一个面向ASP.NET开发人员的库&#xff0c;它简化了将实时Web功能添加到应用程序中的过程。实时Web功能指的是服务器代码能够即时地将内容推送到连接的客户端&#xff0c;而不需要客户端每次都发送请求来获取新数据。 SignalR是一个集成的客户端与服务器库&#xff0c…

MCU最小系统电路设计(以STM32F103C8T6为例)

目录 一、何为最小系统&#xff1f; 二、最小系统电路设计 1.电源 &#xff08;1&#xff09;各种名词解释 &#xff08;2&#xff09;为什么会有VDD_1 _2 _3区分&#xff1f; &#xff08;3&#xff09;Mirco USB &#xff08;4&#xff09;5v->3.3v滤波电路 &#…

Unity(第九部)物体类

拿到物体的某些数据 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//拿到当前脚本所挂载的游戏物体//GameObject go this.gameObject;…

naive-ui-admin 表格去掉工具栏toolbar

使用naive-ui-admin的时候&#xff0c;有时候不需要显示工具栏&#xff0c;工具栏太占地方了。 1.在src/components/Table/src/props.ts 里面添加属性 showToolbar 默认显示&#xff0c;在不需要的地方传false。也可以默认不显示 &#xff0c;这个根据需求来。 2.在src/compo…