Spring的三种异常处理方式

news2024/11/18 21:50:58

1.SpringMVC 异常的处理流程

        异常分为编译时异常和运行时异常,编译时异常我们 try-cache 进行捕获,捕获后自行处理,而运行时异常是不 可预期的,就需要规范编码来避免,在SpringMVC 中,不管是编译异常还是运行时异常,都可以最终由 SpringMVC提供的异常处理器进行统一处理,这样就避免了随时随地捕获处理的繁琐性。

        SpringMVC 处理异常的思路是,一路向上抛,都抛给前端控制器 DispatcherServlet ,DispatcherServlet 在调 用异常处理器ExceptionResolver进行处理,如下图:

 2.SpringMVC 的异常处理方式

 SpringMVC 提供了以下三种处理异常的方式:

  • 简单异常处理器:使用SpringMVC 内置的异常处理器处理SimpleMappingExceptionResolver;
  • 自定义异常处理器:实现HandlerExceptionResolver接口,自定义异常进行处理;
  • 注解方式:使用@ControllerAdvice + @ExceptionHandler 来处理

        1.使用SimpleMappingExceptionResolver处理一些简单异常,配置开启SimpleMappingExceptionResolver, 并指定异常捕获后的处理动作,当发生了异常后,会被 SimpleMappingExceptionResolver 处理,跳转到我们 配置的错误页面error.html给用户进行友好展示 

<!--配置简单异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 <!-- 异常捕获后动作:展示视图 -->
 <property name="defaultErrorView" value="/error.html"/>
</bean

 可以在配置SimpleMappingExceptionResolver时,指定一些参数,例如:异常的类型

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 <property name="defaultErrorView" value="/error.html"/>
 <property name="exceptionMappings">
 <props>
 <!-- 配置异常类型对应的展示视图 -->
 <prop key="java.lang.RuntimeException">/error.html</prop>
 <prop key="java.io.FileNotFoundException">/io.html</prop>
 </props>
 </property>
</bean> 

注解方式配置简单映射异常处理器 

@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
     //创建SimpleMappingExceptionResolver
     SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
     //设置默认错误展示视图
     resolver.setDefaultErrorView("/error.html");
     //定义Properties设置特殊异常对应的映射视图
     Properties properties = new Properties();
     properties.setProperty("java.lang.RuntimeException","/error.html");
     properties.setProperty("java.io.FileNotFoundException","/io.html");
     resolver.setExceptionMappings(properties);
     return resolver;
}

 2.自定义异常处理器,实现HandlerExceptionResolver接口自定义异常处理器,可以完成异常逻辑的处理

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
     @Override
     //参数Object是当前目标方法处理器对象HandlerMethod
     public ModelAndView resolveException(HttpServletRequest httpServletRequest, 
         HttpServletResponse httpServletResponse, Object o, Exception e) {
         ModelAndView modelAndView = new ModelAndView();
         modelAndView.setViewName("/error.html");
         return modelAndView;
     }
}

交给Spring管理异常处理器

<bean class="com.fly.exception.MyHandlerExceptionResolver"></bean>

自定义异常处理器,返回Json格式字符串信息

@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
     @Override
     public ModelAndView resolveException(HttpServletRequest httpServletRequest, 
        HttpServletResponse httpServletResponse, Object o, Exception e) {
         //编写要返回的json格式的字符串
         String jsonStr = "{\"code\":0,\"message\":\"error\",\"data\":\"\"}";
         try {
             httpServletResponse.getWriter().write(jsonStr);
         } catch (IOException e1) {
             e1.printStackTrace();
         }
         return null;
     }
}

 3.使用注解 @ControllerAdvice + @ExceptionHandler 配置异常,@ControllerAdvice 注解本质是一个 @Component,也会被扫描到,与此同时,具备AOP功能,默认情况下对所有的Controller都进行拦截操作, 拦截后干什么呢?就需要在结合@ExceptionHandler、@InitBinder、@ModelAttribute 注解一起使用了,此 处我们讲解的是异常,所以是@ControllerAdvice + @ExceptionHandler的组合形式

编写全局异常处理器类,使用@ControllerAdvice标注,且@ExceptionHandler指定异常类型

@ControllerAdvice
public class GlobalExceptionHandler {
     @ExceptionHandler(RuntimeException.class)
     public ModelAndView runtimeHandleException(RuntimeException e){
         System.out.println("全局异常处理器执行...."+e);
         ModelAndView modelAndView = new ModelAndView("/error.html");
         return modelAndView;
     }
     @ExceptionHandler(IOException.class)
     @ResponseBody
     public ResultInfo ioHandleException(IOException e){
         //模拟一个ResultInfo
         ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
         return resultInfo;
     }
}

如果全局异常处理器响应的数据都是Json格式的字符串的话,可以使用@RestControllerAdvice替代 @ControllerAdvice 和 @ResponseBody

@RestControllerAdvice
public class GlobalExceptionHandler {
     @ExceptionHandler(RuntimeException.class)
     public ResultInfo runtimeHandleException(RuntimeException e){
         //模拟一个ResultInfo
         ResultInfo resultInfo = new ResultInfo(0,"RuntimeException",null);
         return resultInfo;
     }
     @ExceptionHandler(IOException.class)
     public ResultInfo ioHandleException(IOException e){
         //模拟一个ResultInfo
         ResultInfo resultInfo = new ResultInfo(0,"IOException",null);
         return resultInfo;
     }
}

3.SpringMVC 常用的异常解析器

接口/类说明
HandlerExceptionResolver异常处理器类的顶级接口,实现了该接口的类都会作为异常处理器类
MyHandlerExceptionResolver自定义的处理器类,实现了HandlerExceptionResolver接口
HandlerExceptionResolverComposite异常解析器混合器,内部存在集合存储多种异常解析器
SimpleMappingExceptionResolver简单映射异常处理器,可以配置异常与对应的错误视图
ExceptionHandlerExceptionResolver异常处理器异常解析器,默认会被注册到Spring容器中,@ExceptionHandler方式 异常处理就是该解析器解析的
DefaultHandlerExceptionResolver默认处理器异常解析器,所有异常处理器都不匹配时,最后执行的异常处理器
ResponseStatusExceptionResolver响应状态异常解析器,结合使用@ResponseStatus标注的异常使用

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

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

相关文章

激活函数总结(十):激活函数补充(Identity、LogSigmoid、Bent Identity)

激活函数总结&#xff08;十&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Identity激活函数2.2 LogSigmoid激活函数2.3 Bent Identity激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、…

【校招VIP】测试方案之等价类

考点介绍&#xff1a; 在校招中&#xff0c;等价类也是重要的考查点。等价类划分是一种典型的黑盒测试设计方法&#xff0c;使用该方法主要对测试子项进行测试规格分析&#xff0c;得到用例&#xff0c;而不用对系统内部处理进行深入了解&#xff0c;它也是目前测试设计过程中使…

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料&#xff1a;https://blo…

大势智慧软硬件技术答疑第九期

1.在使用模方修模大面积水面时&#xff0c;原模型没有瓦片的区域修补不了&#xff0c;软件也没有新增瓦片&#xff0c;怎么解决&#xff1f; 答&#xff1a;规则分块的数据&#xff0c;然后用新版本模方处理&#xff0c;设置好对应的空间框架。 2.重建大师密集匹配-纠正影像失败…

生产订单负数WIP处理方法(未发生费用准备金)

这个月财务在月结的时候反馈生产成本与制造费用不一致相差20多万&#xff0c; 先查看3611 制造相关的成本中心看上去过量与吸收不足均是0&#xff0c;都是ok的。 再查看一下啊 S_ALR_87013127 工单的投入产出平衡检查&#xff1a;订单结算后&#xff0c;实际成本借方实际成本贷…

[GitOps]微服务版本控制:使用ArgoCD 部署Grafana Loki

背景介绍 请回答&#xff1a;你们是如何保证线上部署的服务&#xff0c;从服务版本到参数配置&#xff0c;都是和测试通过的版本是一致的呢&#xff1f; 本文将介绍GitOps的基本原理以及ArgoCD的使用&#xff1a;ArgoCD部署Grafana Loki 到k8s集群。 本文项目地址&#xff1…

File Inclusion

File Inclusion 服务器执行PHP文件时&#xff0c;可以通过文件包含函数加载另一个文件中的PHP代码&#xff0c;并且当PHP来执行&#xff0c;这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时&#xff0c;您只更新一个包含…

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrlk(代码中编辑) 2、快捷键ctrll 右侧打开窗口

最新MPAS跨尺度、可变分辨率模式实践技术应用及典型案例分析

目录 一、MPAS 模式基本信息 二、MPAS 代码获取及结构 三、MPAS 移植、编译及运行实践 四、MPAS 全球均匀网格的运行 五、MPAS 全球非均匀网格的运行 六、MPAS 区域网格的运行 七、MPAS 运行中的配置 八、MPAS结果处理、分析及可视化 九、了解 MPAS代码的结构、主要模…

攻防世界-web-fileclude

1. 题目描述 打开链接&#xff0c;可以看到如下代码&#xff1a; 代码意思很简单&#xff0c;让我们传递两个参数&#xff0c;一个file1&#xff0c;一个file2&#xff0c;如果file2的内容为hello ctf&#xff0c;那么就可以在代码中include file1 2. 思路分析 这道题显然是…

Android Stodio编译JNI项目,Cmake出错:Detecting C compiler ABI info - failed

在使用Android Stodio编译JNI项目时出现Cmake错误&#xff0c;报错如下&#xff1a; Execution failed for task :app:configureCMakeDebug[arm64-v8a]. > [CXX1429] error when building with cmake using C:\Users\Dell\AndroidStudioProjects\MyApplication2\app\src\ma…

BDA初级分析——认识SQL,认识基础语法

一、认识SQL SQL作为实用技能&#xff0c;热度高、应用广泛 在对数据分析人员的调查中SQL长期作为热度排名第-一的编程语言超过Python和R SQL&#xff1a;易学易用&#xff0c;高效强大的语言 SQL&#xff1a;Structured Query Language 结构化查询语言 SQL&#xff1a;易学…

svn 过滤文件

1. 右键点击&#xff0c;依次选择 TortoiseSVN -> Settings 2. 添加需要过滤的后缀/关键词【 *.iml *.idea *.jar *.class 】

周期 角频率 频率 振幅 初相角

周期 角频率 频率 振幅 初相角 当我们谈论傅里叶级数或波形分析时&#xff0c;以下术语经常出现&#xff1a; 周期 T T T: 函数在其图形上重复的时间或空间的长度。周期的倒数是频率。 频率 f f f: 周期的倒数&#xff0c;即一秒内波形重复的次数。单位通常为赫兹&#xff…

Unity引擎使用InteriorCubeMap采样制作假室内效果

Unity引擎制作假室内效果 大家好&#xff0c;我是阿赵。   这次来介绍一种使用CubeMap做假室内效果的方式。这种技术名叫InteriorCubeMap&#xff0c;是UE引擎自带的节点效果。我这里是在Unity引擎里面的实现。 一、效果展示 这个假室内效果&#xff0c;要动态看才能看出效…

Centos上df命令执行无结果卡住没反应记录

记录linux服务器上df命令卡住&#xff0c;解决办法&#xff1a; 报错如下&#xff0c;执行df命令一直卡着&#xff0c;不返回结果&#xff0c;没反应&#xff1a; 想着是之前挂载的其他盘符&#xff0c;由于迁移导致的磁盘卡住&#xff0c;执行如下命令&#xff1a; strace d…

c++实现哈希桶

闭散列的回顾 在前面的学习中我们知道了闭散列的运算规则&#xff0c;当两个数据计算得到的位置发生冲突时&#xff0c;它会自动的往后寻找没有发生冲突的位置&#xff0c;比如说当前数据的内容如下&#xff1a; 当插入的数据为33时计算的位置为3&#xff0c;可是位置3已经被占…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型&#xff0c;目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现&#xff0c;从数千个三维人体扫描结果得来&#xff0c;后通过PCA统计学习得来。 论文&#xff1a;SMPL: A Skinned Multi-Person Linear Mode…

教学资源VR设备中控系统为教师带来了许多便利

为提升VR实训室教学的质量&#xff0c;虚拟课堂VR中控系统作为一种新型的教学辅助工具&#xff0c;为学生和教师带来了许多独特的优势。 虚拟课堂VR中控系统作为一种新型的教育工具&#xff0c;为教师带来了许多便利&#xff0c;提高了教学质量和效果。教师可以在VR教室里的触摸…