高级java每日一道面试题-2025年01月28日-框架篇[SpringBoot篇]-如何使用Spring Boot实现异常处理?

server/2025/2/7 3:05:26/

如果有遗漏,评论区告诉我进行补充

面试官: 如何使用Spring Boot实现异常处理?

我回答:

在 Java 高级面试中讨论如何使用 Spring Boot 实现异常处理时,我们可以从多个角度进行详细阐述。这包括全局异常处理、特定异常处理、使用 @ResponseStatus 注解、自定义异常类、异常处理与日志记录、异常处理与前端交互的最佳实践等。以下是对这些方面的综合介绍:

一、Spring Boot 异常处理概述

Spring Boot 提供了多种方式来处理异常,确保开发者能够灵活地捕获和处理应用程序中的各种异常。这不仅有助于提供用户友好的错误响应,还能进行必要的日志记录以便后续分析。

二、全局异常处理

使用 @ControllerAdvice@ExceptionHandler
  • 创建一个类并使用 @ControllerAdvice 注解:这个类会被 Spring 识别为全局异常处理类。
  • 在该类中使用 @ExceptionHandler 注解:标记处理特定异常的方法。

示例代码:

java">import org.springframework.http.HttpStatus;
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;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)@ResponseBodypublic ResponseEntity<String> handleAllExceptions(Exception e) {// 这里可以记录日志、返回错误信息给前端等return new ResponseEntity<>("An unexpected error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}// 可以添加更多的 @ExceptionHandler 方法来处理特定的异常类型
}

三、特定异常处理

除了全局异常处理外,Spring Boot 还允许在控制器中处理特定的异常。通过在控制器方法中使用 @ExceptionHandler 注解,可以针对特定类型的异常进行处理。

示例代码:

java">import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/test")public String test() throws CustomException {throw new CustomException("This is a custom exception.");}@ExceptionHandler(CustomException.class)public ResponseEntity<String> handleCustomException(CustomException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);}
}

四、使用 @ResponseStatus 注解

对于某些特定的异常,可以直接在异常类上使用 @ResponseStatus 注解来指定当该异常被抛出时应该返回的 HTTP 状态码。

示例代码:

java">import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

五、自定义异常类

为了更好地组织和管理异常,开发者可以创建自定义的异常类,并在这些类中使用 @ResponseStatus 注解或让它们继承自带有 @ResponseStatus 注解的异常类。

示例代码:

java">public class CustomException extends RuntimeException {public CustomException(String message) {super(message);}public CustomException(String message, Throwable cause) {super(message, cause);}
}

六、异常处理与日志记录

在处理异常时,通常还需要记录日志以便后续分析和调试。Spring Boot 可以与各种日志框架(如 Logback、Log4j 等)集成,开发者可以在异常处理方法中使用这些日志框架来记录异常信息。

示例代码:

java">import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = Exception.class)public ResponseEntity<String> handleAllExceptions(Exception e) {logger.error("Unexpected error occurred", e);return new ResponseEntity<>("An unexpected error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

七、异常处理与前端交互

在 Web 应用程序中,异常处理还需要考虑与前端的交互。通常,开发者会设计一套统一的错误响应格式,并在异常处理方法中返回这种格式的响应。这样,前端就可以根据响应中的错误代码或消息来显示相应的错误提示。

示例代码:

java">import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception e) {ErrorResponse errorResponse = new ErrorResponse("ERROR", e.getMessage());return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);}
}class ErrorResponse {private String status;private String message;public ErrorResponse(String status, String message) {this.status = status;this.message = message;}// Getters and Setters
}

八、最佳实践

  1. 不要捕获并吞掉异常:捕获异常后应该进行适当的处理(如记录日志、返回错误信息给前端等),而不是简单地吞掉异常。
  2. 区分业务异常和技术异常:业务异常应该由业务层抛出并由控制器层捕获处理;技术异常(如数据库连接异常、网络异常等)则应该在全局异常处理类中统一处理。
  3. 提供有用的错误信息:返回给前端的错误信息应该是有意义的,能够帮助前端开发者或用户定位问题。
  4. 使用统一的错误响应格式:这有助于前端开发者更方便地处理错误响应。

总结

在 Spring Boot 中实现异常处理需要综合运用多种机制和技巧,包括全局异常处理、特定异常处理、使用 @ResponseStatus 注解、自定义异常类以及异常处理与日志记录和前端交互的最佳实践。理解这些机制及其应用场景,有助于构建健壮的应用程序,并在面试中展示出对 Spring Boot 框架深入的理解和实际项目经验。


http://www.ppmy.cn/server/165571.html

相关文章

解决浏览器播放音频声音,没交互前不播放问题

方法一&#xff1a;通过显示“需要播放音频”弹窗&#xff0c;进行交互之后播放。 <audio ref"audioRef"><source src"./mp3/tishi.mp3" /></audio><script setup>import { ref } from vuelet audioRef ref(null)onMounted(() &g…

【数据结构-字典树】力扣211. 添加与搜索单词 - 数据结构设计

请你设计一个数据结构&#xff0c;支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。 实现词典类 WordDictionary &#xff1a; WordDictionary() 初始化词典对象 void addWord(word) 将 word 添加到数据结构中&#xff0c;之后可以对它进行匹配 bool search(…

深度学习中,文本分类任务怎么做

一、处理流程 前置步骤&#xff1a; 标注数据得到数据集数据清理&#xff1a;将特殊字符、特殊格式、无效字符去除 正式步骤&#xff1a; 1、分词或分字&#xff1a;英文一般都分词&#xff0c;中文有分词也有分字。分词还是分字取决于你模型的embedding。 2、将字或词编辑ID…

深度学习 | 表示学习 | 卷积神经网络 | Batch Normalization 在 CNN 中的示例 | 20

如是我闻&#xff1a; 让我们来用一个具体的例子说明 Batch Normalization 在 CNN 里的计算过程&#xff0c;特别是如何对每个通道&#xff08;channel&#xff09;进行归一化。 1. 假设我们有一个 CNN 层的输出 假设某个 CNN 层的输出是一个 4D 张量&#xff0c;形状为&#…

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中&#xff0c;异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括&#xff1a; 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…

SpringBoot使用 easy-captcha 实现验证码登录功能

文章目录 一、 环境准备1. 解决思路2. 接口文档3. redis下载 二、后端实现1. 引入依赖2. 添加配置3. 后端代码实现4. 前端代码实现 在前后端分离的项目中&#xff0c;登录功能是必不可少的。为了提高安全性&#xff0c;通常会加入验证码验证。 easy-captcha 是一个简单易用的验…

Java小白入门教程:LinkedList

目录 一、定义 二、作用 1、存储数据 2、动态扩容 3、提供方便的操作方法 三、使用场景 1.当你需要频繁地在列表的开头或结尾添加或删除元素时。 2.当你不需要按索引快速访问元素时&#xff0c;因为LinkedList访问元素需要从头开始遍历 3.当你不需要线程安全的数据结构…