在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. Qt获取电脑有几个网卡,并获取对应的IPV4

    标题:Qt获取电脑网卡对应的ip | Qt计算电脑有几个网卡 | Qt获取网卡ip信息 | Qt判断获取到的ip是否是IPV4   demo流程: 1.点击搜索网卡按钮,搜索电脑所有的网卡,将网卡名称 ...

  2. selenium报错:Message: stale element reference: element is not attached to the page document

    在使用selenium时,报了一个错误 报错的原因: 所引用的元素已过时,不再依附于当前页面.通常情况下,这是因为页面进行了刷新或跳转 解决方法: 重新定位元素 代码示例: # 旧代码(报错) lis ...

  3. openGauss内存引擎中的索引

    一.索引 索引是一种用于快速查询和检索数据的数据结构.常见的索引结构有: B 树, B+树和 Hash. 索引的作用就相当于目录的作用.打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一 ...

  4. npm发包教程

    1-npm注册账号 访问npm官网注册账号,邮件验证激活账号 npm官网 2-项目npm配置 在项目下打开终端,初始化npm npm init -y 此时项目下会生成package.json 配置文件 ...

  5. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发

    由HDE夏德旺老师主讲的Hello HarmonyOS进阶系列应用篇第六课<短视频应用开发>, 已于6月8日晚上 19 点在HarmonyOS社群内成功举行. 本节课夏德旺老师带领大家了解 ...

  6. 纯钧chunjun的http-x插件修复

    简介 chunjun是一款基于flink的开源数据同步工具,官方文档,其提供了很多flink官方未提供的插件供大家来使用,特别是达梦插件在国产化环境中很方便! 本次介绍的是chunjun中的一款htt ...

  7. 前端使用 Konva 实现可视化设计器(5)

    关于第三章提到的 selectingNodesArea,在后续的实现中已经精简掉了. 而 transformer 的 dragBoundFunc 中的逻辑,也直接移动 transformer 的 dr ...

  8. HarmonyOS NEXT应用开发案例—自定义日历选择器

    介绍 本示例介绍通过CustomDialogController类显示自定义日历选择器. 效果图预览 使用说明 加载完成后显示主界面,点当前日期后会弹出日历选择器,选择日期后会关闭弹窗,主页面日期会变 ...

  9. 阿里云 MSE 支持 Go 语言流量防护

    简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定.完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理.阿里云微服务引擎(MSE)也会逐步支持 OpenSe ...

  10. 云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析

    简介: RocketMQ 给人最大的印象一直是一个消息引擎.那什么是事件驱动引擎?为什么我们这次要推出事件驱动引擎这个产品?他有哪些应用场景,以及对应的技术方案是什么?本文我们就一起来看下. 作者:罗 ...