首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ControllerAdvice不处理引发的异常

基础概念

@ControllerAdvice 是 Spring 框架中的一个注解,用于全局处理控制器层的异常。它允许开发者在一个集中的地方定义异常处理逻辑,从而避免在每个控制器方法中重复编写异常处理代码。

相关优势

  1. 集中管理:将异常处理逻辑集中在一个地方,便于维护和管理。
  2. 代码复用:避免在多个控制器中重复相同的异常处理代码。
  3. 统一响应格式:可以定义统一的错误响应格式,提升用户体验和系统的一致性。

类型与应用场景

  • 全局异常处理:适用于所有控制器抛出的异常。
  • 特定异常处理:可以通过 @ExceptionHandler 注解指定处理特定类型的异常。
  • 特定控制器异常处理:结合 @ControllerAdvice@ExceptionHandler 可以针对特定控制器进行异常处理。

常见问题及原因

1. @ControllerAdvice 不处理引发的异常

原因分析

  • 未正确配置:可能没有在类上添加 @ControllerAdvice 注解。
  • 包扫描问题:Spring 可能没有扫描到包含 @ControllerAdvice 的类。
  • 异常类型不匹配@ExceptionHandler 方法可能没有正确指定要处理的异常类型。
  • 优先级问题:可能存在其他更具体的异常处理器优先处理了异常。

解决方案

1. 确保正确配置 @ControllerAdvice

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

2. 检查包扫描路径

确保 Spring 配置文件或启动类中包含了正确的包扫描路径。

代码语言:txt
复制
@SpringBootApplication(scanBasePackages = "com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 明确指定异常类型

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SpecificException.class)
    public ResponseEntity<ErrorResponse> handleSpecificException(SpecificException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}

4. 调整异常处理优先级

如果存在多个异常处理器,可以通过 @Order 注解调整优先级。

代码语言:txt
复制
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HighPriorityExceptionHandler {
    // ...
}

示例代码

假设有一个控制器抛出了一个自定义异常 CustomException

代码语言:txt
复制
@RestController
public class ExampleController {

    @GetMapping("/example")
    public String example() throws CustomException {
        throw new CustomException("This is a custom exception.");
    }
}

对应的 @ControllerAdvice 处理器:

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}

通过以上配置,当 ExampleController 抛出 CustomException 时,GlobalExceptionHandler 将会捕获并处理该异常。

总结

确保 @ControllerAdvice@ExceptionHandler 正确配置,并且 Spring 能够扫描到相关类。通过明确指定异常类型和调整优先级,可以有效解决 @ControllerAdvice 不处理异常的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

@ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常

对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚。...如此一来,我们的 Controller 层就不得不进行 try-catch Service 层的异常,否则会返回一些不友好的错误信息到客户端。...但是,Controller 层每个方法体都写一些模板化的 try-catch 的代码,很难看也难维护,特别是还需要对 Service 层的不同异常进行不同处理的时候。...: @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)...; return jr; } } 这样所有controller层的异常都会返回这样的提示了。

1.4K70
  • 基于@ControllerAdvice注解的SpringBoot项目全局异常处理

    异常在每个项目或者产品里都是或多或少存在的,那么异常处理就变得尤为重要,像try-catch就是用来处理异常,但如果每个方法都判断处理各类异常,那就头重脚轻了。...因而springboot就引入了全局异常处理,注解@ControllerAdvice就是来干这个事的。 ? 这里写了一个controller,如果去请求的肯定是会报错的,页面展示是这个效果。 ?...接下来就用@ControllerAdvice来定义全局异常来处理。定义一个异常辅助类,把@ControllerAdvice加到类上,注解@ExceptionHandler添加到异常处理方法上。...(value = Exception.class) value 标识了要拦截的类型,Exception.class包含所有了,也可以捕获具体的异常类。 ?...这时候重新在请求上面的地址,展示的就是如下的页面。 ? 我们也可以给异常配上一张有意思的图片,可以在ModelAndView里加以配置,异常页面就不会很单调了。

    89920

    Spring使用@ControllerAdvice注解优雅地处理异常信息

    @ControllerAdvice,是Spring3.2+提供的新注解,它是一个Controller增强器,可对Controller中被 @RequestMapping注解的方法加一些逻辑处理。...最常用的就是异常处理。 统一异常处理 需要配合@ExceptionHandler使用。当将异常抛到Controller时,可以对异常进行统一处理,规定返回的json格式或是跳转到一个错误页面。...全局异常捕捉处理  1package cn.itechyou.cms.exception;  2  3import org.apache.shiro.authz.UnauthorizedException...org.springframework.web.servlet.NoHandlerFoundException; 15 16import cn.itechyou.cms.common.ExceptionEnum; 17 18/** 19 * 全局异常处理...    Map map = new HashMap(); 5    map.put("code", "40001"); 6    //判断异常的类型

    80320

    【Spring Boot实战与进阶】全局异常处理@ExceptionHandler+@ControllerAdvice的使用

    汇总目录链接:【Spring Boot实战与进阶】学习目录 文章目录 1、全局异常处理 2、局部异常处理 注解释义ExceptionHandler方法注解,作用于Controller 级别,ExceptionHandler...注解为一个Controler定义一个异常处理器ControllerAdvice类注解,作用于 整个Spring 工程,ControllerAdvice注解定义了一个全局的异常处理器   需要注意的是,ExceptionHandler...的优先级比 ControllerAdvice 高,即优先让 ExceptionHandler 标注的方法处理。...1、全局异常处理 /** * 全局异常处理 */ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler...HttpStatus.INTERNAL_SERVER_ERROR) public String e500() { return "error/500.html"; } } 2、局部异常处理

    46360

    Springboot异常处理只会@ControllerAdvice+@ExceptionHandler?还远远不够!

    同时有个统一的异常处理机制可以提高我们系统的健壮性,微服务化之后系统之间的调用结果会影响到整个服务的可用性。...如果被调用方出现异常没有返回统一的异常处理结果,很容易会调用方疑惑,然后滚大整个异常,这时候你看到整个服务之间都在报错,这不是我们想看到的~ 那么基于springboot,我们有多少种异常处理方式呢?...静态处理 这是一种比较偷懒也是最简单的处理方式,直接放置一个静态的页面。我们静态看到有些项目直接就返回一个大大的404图片作为异常的处理显示,其实就是这里说到的静态处理方式。...作为异常处理的控制器。...那有时候我们想全局处理所有的控制器的异常,于是就有了@ControllerAdvice,它会控制器增强,会应用到所有的controller上,这样就实现了我们想要的全局异常处理。

    2.4K20

    SpringBoot统一异常处理BasicErrorController定义全局异常处理类:并用@ControllerAdvice注解自定义异常类,继承Exception(或RuntimeExcept

    BasicErrorController SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当在页面发生异常的时候会自动把请求转到/error(Spring Boot...提供的一个默认的映射) ,可以自定义页面内容,只需在classpath路径下新建error页面即可。...,另外一种是json请求的时候就会返回json错误 可以查看源码。...定义全局异常处理类:并用@ControllerAdvice注解 返回视图,新建方法defaultErrorHandler 用@ExceptionHandler注解 返回JSON,新建方法 用jsonErrorHandler...自定义异常类,继承Exception(或RuntimeException) ? 页面 ?

    12.4K90

    《Springboot极简教程》系统异常全局统一处理:@ControllerAdvice plus @ExceptionHandler统一异常处理代码实例运行

    统一异常处理 系统有一个统一异常处理的功能,可减少重复代码,又便于维护。 用@ControllerAdvice和@ExceptionHandler两个注解来做异常的统一处理。...@ControllerAdvice:作用于所有@Controller标注的Controller类 @ExceptionHandler:作用于所有@RequestMapping标注的方法抛出的指定类型的异常...* * 系统全局统一异常处理 */ @ControllerAdvice class ExceptionHandlerAdvice { @ExceptionHandler(value =...Exception::class) //表示捕捉到所有的异常,你也可以捕捉一个你自定义的异常 fun exception(exception: Exception, request: WebRequest...系统异常统一处理 ? 螢幕快照 2017-03-30 13.29.14.png ? 螢幕快照 2017-03-30 13.29.04.png ?

    74830

    不按标准引发的bug

    我们曾经在初级和中级培训中给大家详细讲解了Modbus通讯的开发,并多次强调了一定要按照标准协议的要求编写Modbus驱动程序,可是现实中仍然有很多工程师不按照标准,导致通讯中会出现bug,最近也有猿友微我说他的...小猿曾经在嵌入式培训中多次强调告诫大家Modbus通讯中帧完成检测,也就是我们常说的t3.5个字节的帧中断完成检测,和t1.5的字节间检测。...波特率时候t3.5计算出来应该为t3.5=1/19200 * 11 * 3.5 = 2.005ms,也就是说当波特率改变的时候,你的帧完成定时中断的定时器的值是不同的。...如果按照相同的值来检测,那么通信就会出现bug。另一个常见的bug是因为没有做t1.5检测引入的,如上图所示,如果不做t1.5检测,那么不正常的帧2就会被认为是正常,引入通信bug。...假如你的软件要过认证的话,如果你不按标准做,那么认证肯定过不了,因为认证就是按照标准做实验检测的,小猿一直有一个观点,就是有标准的东西一定要按照标准去实现,以标准为依据,依标准为指导,那么你就不会错,而且开发出的程序可移植性强

    72180

    学艺不精引发的血案

    论标题的重要性 今天有个线上小bug,是由zookeeper初始化引起的,把查找修复过程记录一下,其实和zookeeper没多大关系,还是并发的事情,不感兴趣的兄弟们可以撤了,O(∩_∩)O 我的程序中...zk注册失败,就意味着依赖zk的控制逻辑都会时效,比如动态日志级别切换什么的,得找出原因呐。。。 首先找到了spring 配置文件中的zk客户端 ?...接下来是注册节点和监听器的操作类。 ? 这里,用配置的形式,将上面的zkClient添加到这个类的属性中,然后再在init方法中,对将会用到的监听器进行注册 ?...因为我们设置的sync 是false,只是将初始化的工作交出去了,完成没有,真心不知道啊,所以,一旦没有初始化完成,就使用它去进行注册,一定会抛出异常。...是不是很熟悉的错误,在前面的volatile文章中就提到过“类的安全发布”,很显然,这时候的zkClient类的发布,是不安全的 ---- 怎么解决呢,一个方法是把sync设置成true,同步模式,注册完再说别的

    23710

    @ControllerAdvice全局异常处理器没生效?生产报错日志看得眼花缭乱...

    这几天在查看生产日志的时候发现,某个接口打印的报错信息很奇怪,明明是业务异常,却提示接口异常,仔细核查代码,发现原来是@ControllerAdvice全局异常处理器没生效!怎么会这样?...因为Exception是所有异常的父类,所以当程序中抛出异常,添加ExceptionHandler注解的方法中没有具体的异常类型与之相匹配时,那都会被下面的方法捕获处理。...配置的全局异常处理器。...当在控制器的继承链中都没有找到匹配的@ExceptionHandler方法时,Spring会继续查找@ControllerAdvice注解配置的类或HandlerExceptionResolver接口实现的全局异常处理器来处理异常...通过实现HandlerExceptionResolver接口来实现的全局异常处理器,执行的优先级比起@Controller+@ExceptionHandler和@ControllerAdvice+@ExceptionHandler

    82810

    为什么不建议用try catch处理异常?

    既然业务代码不显式地对异常进行捕获、处理,而异常肯定还是处理的,不然系统岂不是动不动就崩溃了,所以必须得有其他地方捕获并处理这些异常。 那么问题来了,如何优雅的处理各种异常?...什么是统一异常处理 Spring 在 3.2 版本增加了一个注解 @ControllerAdvice,可以与 @ExceptionHandler、@InitBinder、@ModelAttribute...所以注解 @ControllerAdvice 出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...借助该注解,我们可以实现:在独立的某个地方,比如单独一个类,定义一套对各种异常的处理机制,然后在类的签名加上注解 @ControllerAdvice,统一对不同阶段的、不同异常进行处理。...实际上,当出现 404 的时候,默认是不抛异常的,而是 forward 跳转到 /error 控制器。

    1.8K21

    【切片】基础不扎实引发的问题

    本次文章主要是来聊聊关于切片传值需要注意的问题,如果不小心,则很容易引发线上问题,如果不够理解,可能会出现奇奇怪怪的现象 问题情况: 小 A 负责一个模块功能的实现,在调试代码的时候可能不仔细,部署到线上环境时发现在现有策略列表上追加新的策略时...对于切片自身的底层数据结构,我们可以通过索引的方式拿到底层数组的地址,并修改其地址上的值,例如 sli[2] = "hello",这是可以直接修改 如果传入的切片,期望实参也能够被改变的话,那么就需要想办法修改切片的底层数组...,然而代码中的 value 仍然是一个拷贝,他并不会真的对外部的 mySlice 有任何影响,结果自然是这样的 可以通过修改切片索引上的值 当然如果我们这样写,去找到索引对应的底层数组的地址,再修改其地址上的值...return sli } 自然通过指针的方式仍然可以 传入的这个指针,实际上也是一个拷贝,只不过拷贝的是这个指针,也就是指针自身的地址不一样,但是他们指向的底层数组是一样的,因此可以直接修改 这种修改的方式...return } 可以看到使用指针的方式,处理起来还是妥妥的,在 appendDemo2 中实际修改了 mySlice 的值,且也是我们所期望的 至此,对于文章开头问题的解决方式,xdm 心中都有数了吧

    15330

    retq指令异常引发的系统重启

    0xffffffff813512c3没有被破坏 因为当前栈指针寄存器rsp的值为RSP:ffff88202e597d98,并且栈是从高地址往低地址延伸的,因此可以知道代码刚从strcpy返回并且把函数返回地址从栈里取出放置到...RIP中,所以正常情况下RIP的值应该是 0xffffffff813512c3,但是当前RIP: 0010:[]。...所以下一条本来要执行的指令应该是0xffffffff813512c3 : movw $0x2,(%r15),但是函数返回时RIP装载的却是是ffffffff813512cb...,因为系统重启了多次,但是通过vtop查看多个vmcore对比出现问题时物理地址都是不相同的,排除是内存问题。...retq是cpu指令,因此推测是cpu异常导致的问题。虽然cpu异常概率很小,但是只要信息充分就大但相信自己的判断吧。

    2.6K20

    python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默

    如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback ,其中包含有关异常的报告。异常是使用 try-except 代码块处理的。...处理ZeroDivisionError异常 下面来看一种导致 Python 引发异常的简单错误。...ZeroDivisionError: integer division or modulo by zero 使用 try-except 代码块 当你认为可能发生了错误时,可编写一个 try-except 代码块来处理可能引发的异常...你让 Python 尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。...except 代码块告诉 Python ,如果它尝试运行 try 代码块中的代码时引发了指定的异常,该怎么办。

    6.1K20
    领券