在Spring Boot应用程序中,捕获全局异常是一个重要的方面,它可以帮助我们处理在应用程序运行时可能发生的各种错误情况。通过适当地捕获和处理这些异常,我们可以改善用户体验并及时采取必要的措施。

使用@ControllerAdvice和@ExceptionHandler

Spring Boot允许我们使用@ControllerAdvice注解和@ExceptionHandler注解来实现全局异常处理。这使得我们可以集中处理应用程序中各处可能抛出的异常,并提供统一的响应。

@ControllerAdvice

@ControllerAdvice是Spring框架提供的注解,用于标记全局控制器的通用配置。它可以用于定义全局异常处理器、全局数据绑定器以及全局模型属性。

在源码中,@ControllerAdvice的作用是使带有该注解的类成为全局控制器配置的持有者。这意味着该类能够捕获应用程序中所有控制器中抛出的异常,或者对控制器中的方法进行统一的前置或后置处理。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
// ...
}

@Target(ElementType.TYPE):

表示该注解可以用于类、接口等。

@Retention(RetentionPolicy.RUNTIME):

指示该注解会在运行时保留,并通过反射等机制进行操作。

@Component:

表示@ControllerAdvice注解本质上也是一个Spring组件。

@ExceptionHandler

@ExceptionHandler是一个用于定义异常处理方法的注解。当结合@ControllerAdvice使用时,它可以指定在特定异常发生时应该执行的处理方法。

在源码中,@ExceptionHandler的作用是告诉Spring框架,当某个特定类型的异常被抛出时,应该调用所标注的方法来进行处理。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
Class<? extends Throwable>[] value() default {};
}

@Target({ElementType.METHOD, ElementType.TYPE})

表示该注解可以用于方法和类上。

@Retention(RetentionPolicy.RUNTIME)

指示该注解会在运行时保留,并通过反射等机制进行操作。

具体代码示例

首先,我们创建一个GlobalExceptionHandler类,并用@ControllerAdvice注解标记它。然后,我们在该类中定义具体的异常处理方法。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus; @ControllerAdvice
public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
} // 可以根据需要添加其他异常处理方法
}

在上面的代码中:

我们创建了一个GlobalExceptionHandler类,并使用@ControllerAdvice注解将其标记为全局异常处理器。@ExceptionHandler注解用于指定要捕获的异常类型,并通过handleException方法来处理这些异常。

在这个示例中,我们捕获了所有类型的Exception,并返回一个带有错误消息的500内部服务器错误响应。在真实的应用程序中,我们还可以根据需要添加其他的异常处理方法,以满足特定的业务需求。

通过以上代码示例,我们演示了如何在Spring Boot应用程序中捕获全局异常。这种方式可以让我们更好地管理应用程序中可能发生的各种异常情况,并提供统一的异常处理机制。

往期面试题:

Java面试题:如果你这样做,你会后悔的,两次启动同一个线程~~~

Java面试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?

Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?

Java面试题:细数ThreadLocal大坑,内存泄露本可避免

Java面试题:请谈谈对ThreadLocal的理解?

Java面试题:为什么HashMap不建议使用对象作为Key?

Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?

Java面试题:线程池内“闹情绪”的线程,怎么办?

Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!

Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?

Java面试题:Spring中的循环依赖,给程序员带来的心理阴影

Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?  

  

Java面试题:SpringBoot异常捕获,让程序“免疫”一切错误!的更多相关文章

  1. 深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?

    SpringBoot异常处理 简介 ​ 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种 ...

  2. JAVA并发,线程异常捕获

    由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: package com.xt.thinks21_2; import java.util.concurrent.Exe ...

  3. JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  4. Java并发之线程异常捕获

    由于线程的本质特性,使得你不能捕获从线程中逃逸的异常,如: import java.util.concurrent.ExecutorService; import java.util.concurre ...

  5. Java面试题(异常篇)

    异常 74.throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是指 ...

  6. java 关于多层的异常捕获

    从这两个源程序可以看出来,这里的逻辑其实很好理清楚. 可以看到,每次抛出了相同的错误,但因为catch后的捕捉类型不同,所以结果不同,其实可以看出多层的异常捕捉和正常的多层代码运行逻辑是基本一致的.

  7. 整理+学习《骆昊-Java面试题全集(上)》

    ★可以关注微信公众号,了解更多技术和行业信息 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不 ...

  8. Java面试题全集(上)转载

    Java面试题全集(上)   2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是 ...

  9. 史上最全Java面试题整理(附参考答案)

    下列面试题都是在网上收集的,本人抱着学习的态度找了下参考答案,有不足的地方还请指正,更多精彩内容可以关注我的微信公众号:Java团长 1.面向对象的特征有哪些方面? 抽象:将同类对象的共同特征提取出来 ...

  10. 经典Java面试题收集

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...

随机推荐

  1. C#读 .properties文件

    引用:https://www.cnblogs.com/wardensky/p/5331851.html properties文件 MONGO_URL = mongodb://172.16.20.3/s ...

  2. 鸿蒙HarmonyOS实战-ArkUI组件(Menu)

    一.Menu组件 Menu组件是一种常见的用户界面(UI)控件,用于在移动应用程序中显示可选项列表.它通常由一系列链接或按钮组成,以帮助用户导航和选择所需的操作.Menu组件可以在水平或垂直方向上呈现 ...

  3. CentOS编译安装Nginx1.5.2+PHP5.5.1+ MySQL 5.6.10

    CentOS编译安装Nginx1.5.2+PHP5.5.1+ MySQL 5.6.10 时间:2013-11-15 23:39 来源:blog.s135.com  作者:张宴的博客  举报  点击:1 ...

  4. 重新整理 .net core 实践篇—————grpc工具[三十四]

    前言 简单整理一下grpc工具. 正文 工具核心包: Grpc.Tools 这个是项目要引用的包,用来生成cs代码的. dotnet-grpc 这个就是cli,命令行工具 dotnet-grpc 核心 ...

  5. tensorflow安装-【老鱼学tensorflow2】

    tensorflow版本已经升级到了2.x,其在易用性上大大增强,主要是由于API采用了keras的方式,大大简化了开发工作. 安装 pip3 install tensorflow 验证 输入如下代码 ...

  6. Linux下源码安装Kong网关

    kong是基于openresty构建的一个网关,并且直接带了很多的功能比如反向代理.负载均衡.限流等模块直接开箱即用,同时兼具OpenResty的高性能,大部分情况下无需编程就可以实现想要的功能,下面 ...

  7. 使用 Docker 部署 Draw.io 在线流程图系统

    1)介绍 Draw.io GitHub:https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具,拥有大量免费素材和模板.程序本身支持中文在内的多 ...

  8. 【ESP32 IDF】用RMT控制 WS2812 彩色灯带

    在上一篇中,老周用 .NET Nano Framework 给大伙伴们演示了 WS2812 灯带的控制,包括用 SPI 和 红外RMT 的方式.利用 RMT 是一个很机灵的方案,不过,可能很多大伙伴对 ...

  9. 全链路灰度之 RocketMQ 灰度

    ​简介:本文将以上次介绍过的<如何用 20 分钟就能获得同款企业级全链路灰度能力?>中的场景为基础,来进一步介绍消息场景的全链路灰度. 作者:亦盏 之前的系列文章中,我们已经通过全链路金丝 ...

  10. Spring Cloud Stream 体系及原理介绍

    简介: Spring Cloud Stream在 Spring Cloud 体系内用于构建高度可扩展的基于事件驱动的微服务,其目的是为了简化消息在 Spring Cloud 应用程序中的开发. 作者 ...