@ControllerAdvice全局异常处理器不起作用了?看看我是怎么解决的

本文主要是介绍@ControllerAdvice全局异常处理器不起作用了?看看我是怎么解决的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:最近项目中使用了@ControllerAdvice+@ExceptionHandler注解组合,实现全局异常处理器,处理代码中手动向上抛出的异常(throws和throw)和自动向上抛出的异常(默认),代码全局异常处理器代码本身写的没问题,但不知道为啥就是不起作用,下面看我怎么解决的吧!

前言:

我们都知道java中异常处理方式有两种

1、就地解决

用try-catch块包裹住容易发生异常的代码片段,这样当该代码片段真正发生异常后,就会立即被catch块捕捉并在catch块中处理,从而使代码继续往下执行,不影响其他代码的执行。

2、向上抛出

如果不想立马就地处理,可以选择将该异常向上抛出,让方法的调用者处理。若方法的调用者也不行处理,同样可以继续向上抛出该异常,以此类推,直到将该异常抛给JVM处理。可是JVM懒啊,一看你们该处理的都不处理是吧,好,我也不处理,我还要把你们方法的调用过程给晒出来,结果就可以在控制台看到方法调用的堆栈信息了。

1、为啥要使用全局异常处理器?

总是用try-catch块包裹代码块也不好,影响性能不说代码看着不是很美观,所以我们选择用第二种——向上抛出的方式。向上抛出没问题,但总要有一个地方处理该异常,在web系统当中还应该将该异常以一个用户可以接受的方式返回给前端,不但在接口对接的时候让前端小姐姐知道是我们后台接口出现了问题,不至于摸不着头脑;而且我们后端开发人员也能根据接口返回的结果快速的知道到底是哪里出现了问题,才能快速解决问题。

2、我的@RestControllerAdvice标注的全局异常处理器

先看下我的全局异常处理器写的没问题是吧:

@RestControllerAdvice //等于@ControllerAdvice+@ResponseBody,和@RestController一个道理
public class OaExpHandler {/*** 处理所有的异常和Throwable类* @param e* @return*/@ExceptionHandler({Exception.class,Throwable.class})public Map<String,Object> testExceptionHandler1(Exception e){System.out.println("进来了");Map<String, Object> map = new HashMap<>();map.put("code",400);map.put("msg","出错啦");return map;}
}  

很简单也没啥问题对吧,但是为啥不行呢?

3、无效的原因

网上有好多是说没有被扫描到,即没有纳入IOC容器中,这确实是一个原因,但我怎么会犯这个错误呢?

其实还有一个原因,@ControllerAdvice全局异常处理器是处理controller中向上抛出后没有被处理的异常,若异常在到达该异常处理器前就已经被处理了,自然就不会到达@ExceptionHandler标注的方法处理。我的就是这个原因...

我看了下controller中没有try-catch块,但是我有两个切面,对所有的controller方法进行了环绕通知——找到原因了啊。

一起看看罪魁祸首:

@Around("controllerPointcutExpress() || actControllerPointcutExpress()")public Object execTimeAround(ProceedingJoinPoint joinPoint) throws Throwable {Object result = null;long start = System.currentTimeMillis();/*try {result = joinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}*/result = joinPoint.proceed();//获取目标方法的全类名MethodSignature signature = (MethodSignature)joinPoint.getSignature();Method targetMethod = signature.getMethod();System.out.println("目标方法:"+targetMethod +"执行总时长为------- {"+(System.currentTimeMillis() - start)+"}毫秒");return result;}

被注释的代码就是那段有罪的代码,可以看到我用try-catch块对proceed()方法进行了包裹,所以一旦目标方法出现了异常,这里的catch块就会非常勤快的捕捉到异常并处理掉,自然没有向上抛出去,也就无法到达@ControllerAdvice标注的全局异常处理器中。看到这里不禁会问,嗯?难道Aspect切面的执行顺序在@ControllerAdvice之前?但是事实上就是这个样子的。

4、根本原因

一张图足以说明一切:

springMVC请求与响应中各组件的执行顺序

看完本篇文章只要能学到两点就可以了

1、理解java异常处理的机制。

2、知道filter、interceptor、controllerAdvice、Aspect、controller在springMVC中的执行顺序。

 

好了,今天就到这里吧,希望看完本篇文章能解决你的问题,若能学点东西就更好了。

另外,祝你每天开心、升职加薪、生活幸福!

 

 

 

 

这篇关于@ControllerAdvice全局异常处理器不起作用了?看看我是怎么解决的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502295

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

Java Exception异常类的继承体系详解

《JavaException异常类的继承体系详解》Java中的异常处理机制分为异常(Exception)和错误(Error)两大类,异常分为编译时异常(CheckedException)和运行时异常... 目录1. 异常类的继承体系2. Error错误3. Exception异常3.1 编译时异常: Che

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

MySQL 5.7彻底卸载与重新安装保姆级教程(附常见问题解决)

《MySQL5.7彻底卸载与重新安装保姆级教程(附常见问题解决)》:本文主要介绍MySQL5.7彻底卸载与重新安装保姆级教程的相关资料,步骤包括停止服务、卸载程序、删除文件和注册表项、清理环境... 目录一、彻底卸载旧版本mysql(核心步骤)二、MySQL 5.7重新安装与配置三、常见问题解决总结废话不多

Python包管理工具pip警告WARNING: Ignoring invalid distribution问题解决

《Python包管理工具pip警告WARNING:Ignoringinvaliddistribution问题解决》pip警告通常是由于包安装不完整、损坏或拼写错误引起的,:本文主要介绍Pyt... 目录前言原因分析解决方法方法 1:手动删除无效元数据(推荐)方法 2:自动清理所有无效包验证修复总结 前言w

mysql笛卡尔积怎么形成以及怎么避免笛卡尔积详解

《mysql笛卡尔积怎么形成以及怎么避免笛卡尔积详解》笛卡尔积是指两个集合中所有可能的有序对的集合,在数据库中它表示两个表的每一行都与另一个表的每一行组合,:本文主要介绍mysql笛卡尔积怎么形成... 目录第一部分:什么是笛卡尔积,它是如何形成的?1. 定义2. 在 mysql 中如何形成3. 笛卡尔积的