Java面试题:SpringBoot异常捕获,让程序“免疫”一切错误!

在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,该如何选择?

相关推荐
叫我阿柒啊1 天前
从Java全栈到Vue3实战:一次真实面试中的技术探索
java·数据库·spring boot·微服务·typescript·vue3·restful
武子康1 天前
Java-118 深入浅出 MySQL ShardingSphere 分片剖析:SQL 支持范围、限制与优化实践
java·大数据·数据库·分布式·sql·mysql·性能优化
努力努力再努力wz1 天前
【c++进阶系列】:万字详解AVL树(附源码实现)
java·运维·开发语言·c++·redis
爱学习de测试小白1 天前
13-Java-面向对象-封装和this关键字
java
-哈喽沃德-1 天前
Date、BigDecimal类型值转换
java
凉、介1 天前
U-Boot 多 CPU 执行状态引导
java·服务器·前端
一个尚在学习的计算机小白1 天前
spring
android·java·spring
csdn_clwjc1 天前
synchronized 锁升级
java·juc
脚大江山稳1 天前
docker使用nginxWebUI配置
java·docker·容器
Miraitowa_cheems1 天前
LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
java·算法·leetcode·链表·职场和发展