广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringMVC之异常处理解读
  • 409
分享到

SpringMVC之异常处理解读

SpringMVC异常处理SpringMVC异常处理SpringMVC异常 2023-03-21 11:03:28 409人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录背景源码分析DispatcherServletExceptionHandlerExceptionResolverExceptionHandlerMethodResolver自定义

背景

我们的代码中,总是会抛出各种异常,例如HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException,或者是自己定义的BusinessException。

这些异常,如果我们不将它们try catch进行处理,就会导致http的状态码变成非20x,并返回springMVC默认的异常信息格式。

场景1:业务部门对返回值进行了统一的规定,例如:{"code":200,  "message": "success", "data": {}},当发生异常的时候,并不希望http状态码变成非20x,而是保持200,通过code来表达调用是否成功,通过message来返回失败的原因。

场景2:业务部门希望发生异常的时候,返回异常信息使用的不是springmvc默认的格式,而是自定义自己的格式,返回更多辅助排查问题的信息。

这两种场景,都需要对未捕获的异常进行处理,这就需要利用上SpringMvc的异常处理拓展点。

接下来基于spring-WEBmvc-5.3.8来分析一下异常处理~

源码分析

DispatcherServlet

DispatcherServlet是SpringMvc的入口,所有请求都经过DispatcherServlet,再进入我们定义的@Controller接口中,进行处理。

接口发生异常时,也由DispatcherServlet的handlerExceptionResolvers属性所持有的HandlerExceptionResolver来处理。

在DispatcherServlet.initHandlerExceptionResolvers中,对handlerExceptionResolers进行初始化:

  • 如果DispatcherServlet.detectAllHandlerExceptionResolvers属性为true,则会获取Spring容器中所有类型为HandlerExceptionResolver的bean
  • 如果DispatcherServlet.detectAllHandlerExceptionResolvers属性为false,则会尝试获取beanName为HANDLER_EXCEPTION_RESOLVER_BEAN_NAME的HandlerExceptionResolver的bean
  • 最后,如果从Spring容器中,找不到HandlerExceptionResolver,则会采用默认策略,生成默认的异常处理

默认情况下,detectAllHandlerExceptionResolvers为true,而Spring容器里也会有三个HandlerExceptionResolver:

  • ExceptionHandlerExceptionResolver,使用用户加了@EcxceptionHandler注解的方法来处理异常。
  • ResponseStatusExceptionHandler,如果异常类型是ResponseStatusException,则根据异常中的status和reason,利用httpservletResponse.sendError来返回异常信息。
  • DefaultHandlerExceptionResolver,当前两个解析器没有成功处理,则该处理器会处理一些指定的异常类型,例如HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException、HttpMediaTypeNotAcceptableException等等;通过HttpServletResponse.sendError来返回异常信息。

ExceptionHandlerExceptionResolver

异常处理器的的处理能力来自于持有的ExceptionHandlerMethodResolver对象,有两个属性持有该类型的对象:

  • Map<Class<?>, ExceptionHandlerMethodResolver> exceptionHandlerCache缓存来自加了@Controller注解的bean中加了@ExceptionHanlder的方法,所以key是加了@Controller注解的类,value就是对应方法的ExceptionHandlerMethodResolver封装。优先于exceptionHandlerAdviceCache
  • Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> exceptionHandlerAdviceCache,则是缓存了@ControllerAdvice注解的类中的异常处理,key是@ControllerAdvice的对象,value是加了@ExceptionHandler的方法对应的ExceptionHandlerMethodResolver封装。

在处理异常的方法doResolveHandlerMethodException中,会调用getExceptionHandlerMethod方法,从exceptionHandlerCache和exceptionHandlerAdviceCache获得ServletInvocableHandlerMethod。如果ServletInvocableHandlerMethod不为空,则用ServletInvocableHandlerMethod.invokeAndHandle处理异常。

所以重点就是在这两个属性的内容来源!!!

exceptionHandlerCache的内容,是在解析异常的时候才被逐步初始化,类似懒加载:

handlerMethod是抛异常的@Controller注解类的方法,handlerType就是@Controller注解的类。

注意!!!由于handlerType就是@Controller注解的类,所以new出来的ExceptionHandlerMethodResolver只会处理倒该@Controller注解的类抛出的异常(exceptionHandlerCache的key是handlerType)。

exceptionHandlerAdviceCache属性的的初始在,是在afterPropertiesSet中调用initExceptionHandlerAdviceCache,会获取Spring容器中所有加了@ControllerAdvice注解的bean,如果这些bean中有加了@ExceptionHandler注解的方法,则会被放到exceptionHandlerAdviceCache中。

 

ExceptionHandlerMethodResolver

再分析一下ExceptionHandlerMethodResolver的能力~

在构造函数中,会根据handlerType,通过反射的方式,选择类中加了@ExceptionHandler注解的方法,将@ExceptionHandler中的异常类型作为key,方法本身作为value,设置到mappedMethods中。

而excptionLookupCache则作为根据Throwable类型→method处理方法的缓存:

  • 如果能在excptionLookupCache缓存中找到,则直接返回
  • 如果找不到,则尝试从mappedMethods中查找
  • 如果mappedMethods中也没有找到,则会返回NO_MATCHING_EXEPTION_HANDLER_METHOD,该值也会被缓存在excptionLookupCache,这样就能避免缓存击穿!!

自定义异常处理

自定义异常处理的方式有三种:

1、自定义HandlerExceptionResolver类,注册到Spring容器上下文中,这样就会被DispatcherServlet检测到,放到handlerExceptionResolvers属性中,只要优先级高于SpringMvc默认的HandlerExceptionResolver,就可以优先处理异常。

2、在@Controller的类中,添加@ExceptionHandler注解的方法。这样,该方法就会处理其所在controller类抛出的异常。

3、在@ControllerAdvice类中增加@ExceptionHandler注解的方法。@ControllerAdvice类有几个选择属性,basePackages、basePackageClasses、assignableTypes和annotations;如果设置了这几个属性,则只有匹配这些属性规则的@Controller类的异常才会被处理。默认都为空,所有类的异常都会被处理。

拓展研究

1、@ExceptionHandler注解的方法返回值可以有多种类型,研究ServletInvocableHandlerMethod是怎么处理各种返回值类型的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringMVC之异常处理解读

本文链接: https://www.lsjlt.com/news/200692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringMVC之异常处理解读
    目录背景源码分析DispatcherServletExceptionHandlerExceptionResolverExceptionHandlerMethodResolver自定义...
    99+
    2023-03-21
    SpringMVC异常处理 SpringMVC异常 处理SpringMVC异常
  • SpringMVC之异常处理器
    文章目录 前言一、基于配置的异常处理二、基于注解的异常处理总结 前言 SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolv...
    99+
    2023-09-03
    springMVC 后端 java spring
  • SpringMVC异常处理
    8.SpringMVC异常处理 1.1 异常处理的思路 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段...
    99+
    2023-09-01
    spring java mybatis
  • SpringMVC学习之JSON和全局异常处理详解
    目录1.为什么要全局异常处理2.异常处理思路3.SpringMVC异常分类4.综合案例         ...
    99+
    2022-11-13
    springmvc全局异常处理 springmvc的json问题 spring mvc json
  • 详解SpringMVC中的异常处理
    目录1.SpringMVC默认三个异常处理类2.@ExceptionHandler注解异常3.@ResponseStatus注解异常4.DefaultHandlerException...
    99+
    2022-11-11
  • Java SpringMVC异常处理机制详解
    目录异常处理的思路测试环境准备异常处理两种方式方式一:简单异常处理器方式二:自定义异常处理器总结异常处理的思路 测试环境准备 首先写一个DemoController控制层的类作为测...
    99+
    2022-11-12
  • Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解
    Spring3.0 对异常的处理方式总共有两种: 一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 Simple...
    99+
    2022-11-12
  • SpringMVC项目异常处理机制详解
    目录1、异常分类2、自定义项目业务异常3、自定义项目系统异常4、其他异常5、异常代码6、异常处理器7、异常发生1、异常分类 通常分为三类:系统异常(SystemException),...
    99+
    2022-11-13
  • 详解SpringMVC中的异常处理机制
    目录开头1.ExceptionHandlerExceptionResolver2. demo开头 试想一下我们一般怎么统一处理异常呢,答:切面。但抛开切面不讲,如果对每一个contr...
    99+
    2022-11-13
  • SpringMVC异常处理源码分析
    今天小编给大家分享一下SpringMVC异常处理源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。背景我们的代码中,总是...
    99+
    2023-07-05
  • SpringMVC 异常处理机制与自定义异常处理方式
    目录SpringMVC默认处理的几种异常@ResponseStatus异常处理的顺序自定义异常类(SpringMVC的异常处理)①:自定义异常类②:自定义异常处理器③:配置我们的异常...
    99+
    2022-11-12
  • SpringMVC整合SSM实现异常处理器详解
    目录异常处理器项目异常处理方案项目异常处理代码实现根据异常分类自定义异常类自定义异常编码(持续补充)触发自定义异常异常处理器 程序开发过程中不可避免的会遇到异常现象 出现异常现象的...
    99+
    2022-11-13
    SpringMVC整合SSM SpringMVC 异常处理
  • SpringMVC响应处理详细解读
    目录数据处理及跳转1.结果跳转方式2.ResponseBody响应json数据1、导入关键jar导入依赖2、标签配置不过滤静态资源数据处理及跳转 1.结果跳转方式 ①.ModelAn...
    99+
    2022-11-13
  • Java SpringMVC异步处理详解
    目录1、本篇内容2、看段代码,分析问题3、springmvc 中异步处理4、模拟非超时请求5、模拟超时请求6、总结1、本篇内容 本文让大家掌握 springmvc 中异步处理请求,特...
    99+
    2022-11-12
  • SpringMvc异常处理器怎么实现
    这篇文章主要讲解了“SpringMvc异常处理器怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringMvc异常处理器怎么实现”吧! Spri...
    99+
    2022-10-19
  • 详解SpringMVC的拦截器与异常处理机制
    目录1.SpringMVC拦截器1.1拦截器(interceptor)的作用1.2拦截器和过滤器的区别1.3拦截器的快速入门1.4多拦截器操作1.5拦截器方法说明2.SpringMV...
    99+
    2022-11-13
  • SpringMVC基于配置的异常处理器
    目录一、基于配置的异常处理储存异常信息二、基于注解的异常处理一、基于配置的异常处理 SpringMVC 提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExcep...
    99+
    2022-11-13
  • Python 之异常处理
    一 错误和异常 •错误分两种: 1、语法错误 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # 举列 4 print('hello world' # 少) 5 6 def ...
    99+
    2023-01-30
    异常 Python
  • Python之异常处理
    错误包括语法错误和逻辑错误 异常是程序运行时发生错误的信号,解释器追踪程序,根据错误抛出的异常。 常用的异常: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常...
    99+
    2023-01-30
    异常 Python
  • Python学习之异常处理详解
    目录什么是异常与异常处理异常的语法捕获通用异常捕获具体异常如何捕获多个异常捕获多个异常 - 方法1捕获多个异常 - 方法2本章节主要学习 python 中的异常处理,来看一下该章节的...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作