spring异常处理

article/2025/9/14 0:08:59

在项目中采用spring的异常处理机制:

示例一、在Controller中加@ExceptionHandler注解定义异常拦截的方法,在方法中定义返回的页面:

@Controller
public class ExceptionTestController {@ExceptionHandlerpublic String handleException(Exception e) {return "error";}@RequestMapping("/error")public String error(Model model) {throw new RuntimeException();}
}

error.jsp

<html>
<head><title>ok</title>
</head>
<body><h1>===============error============</h1>
</body>
</html>

示例二、将异常处理做成一个公共的:

@ControllerAdvice
public class ViewExceptionHandler {@ExceptionHandler(value = Exception.class)public String handleException(Exception e) {return "error";}
}

效果:

两者区别:示例一只能捕获所属Controller中的方法抛出的异常,不能捕获其他Controller中的,示例二可以捕获所有Controller抛出的异常。

下面看源码分析:

 由handlerAdapter进行反射调用后,调到controller中的具体方法,抛出的异常最终被捕获,将异常赋值给dispatchException,并调用processDispatchResult方法:

 这里获取到handlerMethod

 这里异常解析器是一个混合体,里面有三个异常解析器,这三个异常解析器是什么时候初始化的?

在DispatcherServlet的父类FrameworkServlet中定义了一个内部类,监听spring容器启动后的事件发布:

 会调到DispatcherServlet中的onRefresh方法:

 在这个方法中会拿到spring容器中所有实现了HandlerExceptionResolver接口的实例:

 那spring容器中的实例又是怎么来的呢?就是在开启mvc功能的时候:

 

 如果没有自定义异常解析器,这里会添加默认的,看到的那三个异常解析器就是通过addDefaultHandlerExceptionResolvers方法添加的。这里不再赘述了,有兴趣的可以看一下这部分的源码。

言归正传,看这个混合体的resolveException方法:

最终会调到ExceptionHandlerExceptionResolver中的doResolveHandlerMethodException

 看上图中的getExceptionHandlerMethod方法:

 以上两个截图的意思是寻找controller中的带@ExceptionHandler注解的方法,也就是对应我们示例一中的情况(异常拦截方法和注解要求在controller里面),并获取@ExceptionHandler注解的值,也就是异常类型(如果没定义,就是java.lang.Exception),并建立异常类型和异常处理方法的映射。

建立好映射关系以后,会根据异常类型找到对应的处理方法,并根据controller和异常处理方法作为参数创建ServletInvocableHandlerMethod实例。

由构建的ServletInvocableHandlerMethod进行方法调用,参数解析后,最终会通过反射调到我们定义的异常处理方法:

 

 

 

 接下来的逻辑和其他普通的方法处理一样,不再赘述。

也可以像示例二中的方式,我们单独的写一个全局的异常处理类,加上@ControllerAdvice注解

 

我们可以定义很多个方法,每个方法拦截的异常类型不一样,比如IOException、空指针异常等等。下面看示例二的源码:

和示例一的逻辑差不多,注释掉controller中的@ExceptionHandler方法之后,根据异常获取controller中对应的异常处理方法为空,就会往下走:

 在exceptionHandlerAdviceCache当中找到一个我们定义的全局异常拦截类:

 接下来的处理和示例一的就相同了,也是拿我们定义的异常处理类和方法构造ServletInvocableHandlerMethod,然后进行反射调用。

那么exceptionHandlerAdviceCache中是什么时候初始化的?

上面提到,在没有定义异常解析器的时候,spring会添加默认的异常解析器,看代码:

 在这里会调用afterPropertiesSet()方法:

 

 

 以上代码是拿到spring容器中所有的Object实例,查找有ControllerAdvice注解的bean。接下来拿到ControllerAdvice注解的bean的list集合后进行排序,然后遍历,如图:

 

new ExceptionHandlerMethodResolver(adviceBean.getBeanType())和上面讲过的一样,在构造方法中找全局异常拦截类中带@ExceptionHandler的方法,然后解析,然后建立异常类型和异常处理方法的映射关系。

然后将全局异常处理类和异常解析器放入exceptionHandlerAdviceCache。


http://chatgpt.dhexx.cn/article/HCUaEbst.shtml

相关文章

C语言异常处理

文章目录 前言一、 异常表达二、 异常报告三、 异常处理 前言 错误与异常&#xff1a; 错误与异常都是在程序编译或者运行时出现的错误&#xff0c; 不同的是&#xff0c;异常可以被开发人员捕捉和处理&#xff1b;而错误&#xff0c;一般不需要开发人员处理&#xff08;也无法…

SpringBoot全局异常处理

文章目录 异常处理方案分类基于请求转发基于异常处理器基于过滤器 常见异常处理实现方案1. BasicExceptionController2. ExceptionHandler3. ControllerAdviceExceptionHandler4. SimpleMappingExceptionResolver5. HandlerExceptionResolver6. Filter 全局异常处理实现方案1. …

springboot整合之统一异常处理

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

C++ 异常处理

目录 一、异常的定义 二、异常的抛出和捕获 1.throw 2.try...catch 3.异常安全 4.异常规范 三、系统预定义异常 四、用户自定义异常 一、异常的定义 异常在C用于错误处理&#xff0c;C语言中一般使用返回值表示错误&#xff0c;C对错误处理进行了扩展&#xff0c;统一使…

关于异常处理的知识整理

目录 1.什么是异常&#xff1f; 2.异常继承结构 3.异常结构继承图 4.关于异常处理的两种方式&#xff1a; 5.异常对象有两个非常重要的方法 1.什么是异常&#xff1f; 程序在执行过程中不正常的情况称为异常&#xff0c;以类和对象的形势存在&#xff0c;可以通过异常类&am…

异常处理---

异常 异常处理 例&#xff1a; public class Demo{public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){int[] arr{1,2,3};System.out.println(arr[3]);//数组索引…

异常处理

1.相关概念的介绍 1&#xff09;异常情形&#xff1a;是指阻止当前方法或作用域继续执行的问题。 2&#xff09;监控区域&#xff1a;一段可能产生异常的代码&#xff0c;并且后面跟着处理这些异常的代码。 3&#xff09;try块&#xff1a;如果在方法的内部或者在方法内部调…

异常及异常处理

一、异常的概念 定义&#xff1a; 异常指的是运行期出现的错误&#xff0c;也就是当程序开始执行以后执行期出现的错误。 处理态度&#xff1a; 当捕获到异常以后一定要做出处理&#xff0c;哪怕是把这个异常的错误信息打印出来&#xff0c;这是一种良好的编程习惯。 …

异常处理(throw、throws、try-catch)

Java异常处理的五个关键字try、catch、finally、throw、throws 1.抛出异常throw 在编写程序时&#xff0c;我们必须要考虑程序出现问题的情况。比如&#xff0c;在定义方法时&#xff0c;方法需要接收参数。那么&#xff0c;当调用方法使用接收到的参数时&#xff0c;首先需要…

SpringBoot+Axis2搭建WebService服务端

SpringBootAxis2搭建WebService服务端 之前用过Spring Axis2搭建过WebService项目&#xff0c;网上也有很多资料教程&#xff0c;最近需要在一个SpringBoot项目中添加Axis2的服务端&#xff0c;在网上找了很久&#xff0c;没有找到相关教程&#xff0c;最终经过大神朋友的指点…

AXI(2)完结

四、握手 4.1握手过程 所有的五个通道都是通过相同的VALID/READY握手处理来传输地址、数据和控制信息。 双向握手的机制意味着主机和从机之间传输数据时&#xff0c;都可以控制传输的速率&#xff0c;只有当VALID和READY同时为高电平时&#xff0c;传输才会发生。 发送方&a…

读Axis2用户帮助文档 (axis2中文文档)

作者&#xff1a;李红霞 时间&#xff1a;2006-10-19 声明&#xff1a;本文可以算作Axis2用户手册的翻译&#xff0c;但是翻译后的文本是经过作者理解写出来的&#xff0c;可能有些偏差&#xff0c;欢迎讨论。本文属作者原创&#xff0c;允许转载&#xff0c;但请注明出处。 英…

AXI 3.0 (1)

一、AXI简介 AMBA3.0中新增加了一种总线——AXI&#xff08;Advanced eXtensible Interface&#xff0c;高级扩展接口&#xff09;。 AMBA AXI 协议的目标是高性能、高频的系统设计&#xff0c;其包含了若干特性。 适合高带宽和低延迟的设计 提供高频操作&#xff0c;无需使…

Apache axis2 + Eclipse 开发 WebService

一、简介 Apache Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持&#xff0c;但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写&#xff0c;而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化…

Axis2与Web项目整合

一、说明: 上一篇介绍了通过使用Axis2来发布和调用WebService&#xff0c;但是是把WebService发布在Axis2提供的项目中&#xff0c;如果我们需要在自己的Web项目中来使用Axis2发布WebService该怎么做呢&#xff1f; 本篇即介绍在Web项目中使用Axis2来发布WebService. 二、具体…

Axis2中文手册

中文原文 http://tenn.javaeye.com/blog/100736 英文原文 http://ws.apache.org/axis2/1_0/userguide.html 概述 这个说明文档涉及以下内容&#xff1a;  如何使用 axis2 创建 web service 和客户端程序  如何定制一个模块 (Module) 并在 web service 中使用它  Sam…

axis2的使用(转载)

通过axis2发起WS请求时添加SOAP header 首先要获得一个ServiceClient对象&#xff0c;因为这个对象是org.apache.axis2.client.Stub里面定义的&#xff0c;所以你生成的stub里面应该直接就可以使用这个对象&#xff0c;或者调用stub的_getServiceClient()方法来获取这个对象。 …

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录 一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证 二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码. 一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.…

WebService之Axis2系列教程(一)Axis2的下载、安装和使用

Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如&#xff0c;可以使用WebService来发布服务端 Java类的方法&#xff0c;以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

Axis2 webservice学习总结

一、学习课件目录&#xff1a; Axis2(WebService)培训资料1 - 百度文库 (baidu.com) WebService大讲堂之Axis2 - 百度文库 (baidu.com) 二、学习总结&#xff1a; Web Service是构建互联网分布式系统的基本部件&#xff0c;它是一个应用程序&#xff0c;它向外界暴露出一个…