🎓博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖DeepSeek-行业融合之万象视界(附实战案例详解100+)
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
SpringBoot异常处理实战:全局异常拦截与自定义错误页面设计
一、引言
在开发基于Spring Boot的应用程序时,异常处理是一个至关重要的环节。良好的异常处理机制不仅可以提高系统的稳定性和可靠性,还能为用户提供更加友好的错误提示信息。本文将深入探讨Spring Boot中的异常处理实战,包括全局异常拦截和自定义错误页面设计,旨在帮助技术人员更好地掌握这一关键技能。
二、Spring Boot异常处理基础
2.1 异常分类
在Java中,异常分为受检查异常(Checked Exception)和非受检查异常(Unchecked Exception)。受检查异常需要在代码中显式地捕获或声明抛出,而非受检查异常通常是程序运行时出现的错误,如NullPointerException、ArrayIndexOutOfBoundsException等。
2.2 Spring Boot默认异常处理机制
Spring Boot为我们提供了默认的异常处理机制。当应用程序出现异常时,Spring Boot会返回一个包含错误信息的JSON响应。例如,当访问一个不存在的URL时,会返回如下JSON响应:
{
"timestamp": "2025-03-10T12:00:00.000+00:00",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/nonexistent-url"
}
三、全局异常拦截
3.1 创建全局异常处理器
在Spring Boot中,我们可以通过创建一个全局异常处理器来捕获并处理应用程序中抛出的所有异常。使用@ControllerAdvice和@ExceptionHandler注解可以实现这一功能。以下是一个简单的全局异常处理器示例:
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(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上述代码中,@ControllerAdvice注解表示这是一个全局异常处理器,@ExceptionHandler(Exception.class)表示该方法处理所有类型的异常。当应用程序抛出异常时,会调用handleException方法,并返回一个包含错误信息的响应。
3.2 处理特定异常
除了处理所有类型的异常,我们还可以针对特定的异常类型进行处理。例如,处理NullPointerException:
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(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException e) {
return new ResponseEntity<>("Null pointer exception occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上述代码中,当应用程序抛出NullPointerException时,会调用handleNullPointerException方法进行处理;如果抛出其他类型的异常,则调用handleException方法进行处理。
3.3 记录异常日志
在实际开发中,我们通常需要记录异常信息,以便后续排查问题。可以使用日志框架(如Logback、Log4j)来记录异常信息。以下是一个示例:
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(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
logger.error("An error occurred", e);
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上述代码中,使用Logger记录异常信息,方便后续查看和分析。
四、自定义错误页面设计
4.1 Spring Boot默认错误页面
Spring Boot默认提供了一些错误页面,如404页面、500页面等。当应用程序出现相应的错误时,会自动跳转到默认的错误页面。默认错误页面的位置在src/main/resources/templates/error目录下。
4.2 创建自定义错误页面
我们可以创建自定义的错误页面来替换Spring Boot的默认错误页面。首先,在src/main/resources/templates/error目录下创建相应的HTML文件,如404.html、500.html等。以下是一个简单的404.html示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body>
</html>
同样,可以创建500.html文件来处理服务器内部错误:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500 Internal Server Error</title>
</head>
<body>
<h1>500 Internal Server Error</h1>
<p>An unexpected error occurred on the server.</p>
</body>
</html>
4.3 配置自定义错误页面
为了让Spring Boot使用我们自定义的错误页面,需要进行一些配置。可以通过实现ErrorController接口来实现自定义错误处理逻辑。以下是一个示例:
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CustomErrorController implements ErrorController {
private static final String ERROR_PATH = "/error";
@RequestMapping(ERROR_PATH)
public String handleError() {
return "error/general";
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
在上述代码中,handleError方法返回一个视图名称error/general,表示当出现错误时,跳转到error/general.html页面。
五、实战案例
5.1 项目结构
创建一个简单的Spring Boot项目,项目结构如下:
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── controller
│ │ │ └── UserController.java
│ │ └── exception
│ │ └── GlobalExceptionHandler.java
│ └── resources
│ ├── application.properties
│ └── templates
│ └── error
│ ├── 404.html
│ ├── 500.html
│ └── general.html
5.2 编写控制器
在UserController中编写一个简单的接口,模拟抛出异常:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/users")
public String getUsers() {
throw new RuntimeException("Something went wrong");
}
}
5.3 测试异常处理
启动Spring Boot应用程序,访问http://localhost:8080/users,会触发RuntimeException,全局异常处理器会捕获该异常并返回相应的错误信息。同时,如果出现404错误,会跳转到自定义的404页面。
六、总结
本文详细介绍了Spring Boot中的异常处理实战,包括全局异常拦截和自定义错误页面设计。通过创建全局异常处理器,可以捕获并处理应用程序中抛出的所有异常;通过创建自定义错误页面,可以为用户提供更加友好的错误提示信息。希望本文能够帮助技术人员更好地掌握Spring Boot异常处理的相关知识,提高应用程序的稳定性和可靠性。

1072

被折叠的 条评论
为什么被折叠?



