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

相关推荐
代码之光_198029 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi35 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
对许1 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
lzhlizihang1 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
小鑫记得努力1 小时前
Java类和对象(下篇)
java
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言
老友@1 小时前
aspose如何获取PPT放映页“切换”的“持续时间”值
java·powerpoint·aspose