没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
内容概要:本文详细介绍了Spring Boot的异常处理机制,包括Java标准异常、Spring框架异常和自定义异常的处理方式。文章讲解了如何创建自定义异常类,配置全局异常处理器,并通过@ControllerAdvice和@ExceptionHandler注解实现统一异常处理。此外,还讨论了异常链分析、日志记录与异常处理、事务管理等高级技巧,最后通过实战案例展示了如何处理数据库异常和网络请求异常。 适合人群:具有Java开发经验,尤其是对Spring Boot感兴趣的后端开发工程师。 使用场景及目标:①统一处理不同来源的异常,提供统一的错误响应;②优化日志记录和异常链分析;③在事务管理中有效处理异常。 其他说明:文章提供的实例代码和技术细节,可以帮助开发者在实际项目中更好地实现异常处理,提高系统的健壮性和用户体验。
资源推荐
资源详情
资源评论
1
后端框架:Spring Boot:SpringBoot 异常处理机制
1 SpringBoot 异常处理基础
1.1 SpringBoot 中的异常类型
在 SpringBoot 中,异常处理机制主要围绕 Java 标准异常、Spring 框架异常
以及自定义异常进行。Java 标准异常包括 RuntimeException 和 Exception,而
Spring 框架异常则有如 MethodArgumentNotValidException、
MissingServletRequestParameterException 等,这些异常通常在框架内部自动处
理,为开发者提供了统一的错误信息格式。
1.1.1 示例:Spring 框架异常
当一个 HTTP 请求缺少必要的参数时,Spring 会抛出
MissingServletRequestParameterException。例如,假设我们有一个 REST API,它
需要一个名为 id 的查询参数:
@GetMapping("/users")
public User getUser(@RequestParam("id") String userId) {
//
业务逻辑
}
如果请求中未包含 id 参数,Spring 会自动抛出
MissingServletRequestParameterException,并提供错误信息。
1.2 自定义异常类创建
在 SpringBoot 中,我们经常需要创建自定义异常来处理特定的业务逻辑错
误。自定义异常类通常继承自 RuntimeException 或 Exception,并可以包含额外
的错误信息或数据。
1.2.1 示例:创建自定义异常
假设我们需要创建一个 UserNotFoundException 异常,用于处理用户未找到
的情况:
public class UserNotFoundException extends RuntimeException {
private final String username;
public UserNotFoundException(String username) {
super("User not found: " + username);
this.username = username;
}
2
public String getUsername() {
return username;
}
}
在业务逻辑中,我们可以这样抛出自定义异常:
public User getUser(String username) {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UserNotFoundException(username);
}
return user;
}
1.3 全局异常处理器配置
为了统一处理所有异常,SpringBoot 允许我们配置全局异常处理器。这通
常通过实现 HandlerExceptionResolver 接口或使用@ControllerAdvice 注解来完成。
全局异常处理器可以捕获所有控制器抛出的异常,并提供统一的错误响应。
1.3.1 示例:使用@ControllerAdvice 配置全局异常处理器
创建一个名为 GlobalExceptionHandler 的类,使用@ControllerAdvice 注解,
并定义一个方法来处理 UserNotFoundException:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundExceptio
n ex) {
ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
}
其中,ErrorResponse 是一个简单的类,用于封装错误信息:
public class ErrorResponse {
private int status;
private String message;
public ErrorResponse(int status, String message) {
this.status = status;
this.message = message;
3
}
// Getter
和
Setter
}
这样,每当 UserNotFoundException 被抛出时,GlobalExceptionHandler 中的
handleUserNotFoundException 方法将被调用,返回一个格式化的错误响应。
1.3.2 配置全局异常处理器
除了处理自定义异常,全局异常处理器还可以捕获并处理所有未被捕获的
异常。例如,我们可以添加一个方法来处理所有 Exception:
@ControllerAdvice
public class GlobalExceptionHandler {
// ...
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {
ErrorResponse error = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "A
n unexpected error occurred");
return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
这样,任何未被特定异常处理器捕获的异常都将被 handleAllExceptions 方
法处理,确保应用程序始终返回一个格式化的错误响应。
通过上述方法,SpringBoot 提供了强大的异常处理机制,允许开发者创建
自定义异常、配置全局异常处理器,从而实现对错误的统一管理和响应,提高
应用程序的健壮性和用户体验。
2 控制器层面的异常处理
2.1 @ControllerAdvice 注解详解
@ControllerAdvice 是 Spring 框架提供的一种全局异常处理机制,它可以被
用于定义一个控制器的增强类,该类中的方法可以处理控制器中抛出的异常。
这个注解可以被看作是 AOP(面向切面编程)的一种应用,它允许我们集中处
理异常,而不是在每个控制器方法中重复相同的异常处理代码。
2.1.1 使用场景
统一异常处理:当多个控制器中需要处理相同的异常时,使用
@ControllerAdvice 可以避免代码重复,实现异常处理的统一和标准化。
4
返回自定义错误信息:通过@ControllerAdvice,我们可以自定义
异常处理的返回信息,提高系统的可读性和用户体验。
HTTP 状态码控制:在处理异常时,可以返回不同的 HTTP 状态码,
如 400(Bad Request)、404(Not Found)等,以更准确地反映异常的类
型。
2.1.2 如何使用
1. 定义一个带有@ControllerAdvice 注解的类。
2. 在该类中使用@ExceptionHandler 注解来指定处理哪种类型的异常。
3. 在@ExceptionHandler 方法中返回错误信息和 HTTP 状态码。
2.2 使用@ExceptionHandler 捕获异常
@ExceptionHandler 注解用于处理特定类型的异常。当控制器中抛出的异常
与@ExceptionHandler 注解中指定的异常类型匹配时,该注解所在的方法将被调
用。
2.2.1 示例代码
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.ResponseStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {IllegalArgumentException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<Object> handleIllegalArgumentException(IllegalArgumentException ex)
{
//
自定义错误信息
String errorMessage = "
请求参数错误
: " + ex.getMessage();
//
返回错误信息和
HTTP
状态码
return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(value = {ResourceNotFoundException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<Object> handleResourceNotFoundException(ResourceNotFoundExcepti
on ex) {
//
自定义错误信息
剩余15页未读,继续阅读
资源评论
kkchenjj
- 粉丝: 2w+
- 资源: 5480
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功