@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全局异常处理器不起作用了?看看我是怎么解决的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_40925189/article/details/107092706
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/502295

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp