Spring Boot学习入门之统一异常处理详解
一、简介
在开发Web应用程序时,不可避免地会遇到各种异常情况。如果没有良好的异常处理机制,系统就很难保证稳定性和安全性。Spring Boot提供了很好的异常处理能力,通过统一异常处理机制可以对出现的异常进行捕获,避免异常导致程序崩溃。
二、异常处理流程
Spring Boot中的异常处理流程如下所示:
-
当程序运行时抛出异常,Spring Boot会根据异常类型在整个应用程序中查找与之匹配的异常处理器。
-
如果找到了这样的异常处理器,则调用该处理器,处理抛出的异常。处理器可以将异常记录到日志中,并返回响应给客户端,告知客户端出现了异常。
-
如果没有找到与异常类型匹配的处理器,则抛出异常给异常管理器。
-
异常管理器将会对这个异常进行处理。
-
如果系统中没有配置特定的异常处理配置,则会按照Spring Boot默认的异常处理流程进行处理。
-
程序执行完成后,将会记录所有的异常信息,并返回响应结果给客户端。
三、统一异常处理实现
在Spring Boot中实现统一异常处理需要以下步骤:
- 定义异常基类并继承RuntimeException类
public class BaseException extends RuntimeException {
private String code;
private String message;
public BaseException(String code, String message) {
super(message);
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
- 定义具体的异常类并继承BaseException类
public class BusinessException extends BaseException {
public BusinessException(String code, String message) {
super(code, message);
}
}
- 实现异常处理类,对异常进行分类处理并返回响应结果
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = BusinessException.class)
public Map<String, Object> handleBusinessException(BusinessException e) {
logger.error("Business Exception:{}", e.getMessage());
Map<String, Object> map = new HashMap<>();
map.put("code", e.getCode());
map.put("message", e.getMessage());
return map;
}
@ExceptionHandler(value = Exception.class)
public Map<String, Object> handleException(Exception e) {
logger.error("Exception:{}", e.getMessage());
Map<String, Object> map = new HashMap<>();
map.put("code", "500");
map.put("message", "系统异常");
return map;
}
}
- 在特定的处理方法中通过throw new BusinessException("错误码", "错误信息")方式抛出异常。
四、示例演示
1. 模拟用户注册场景
步骤:
- 创建UserController类
@RestController
@RequestMapping("/user")
public class UserController {
@ApiOperation(value = "用户注册")
@PostMapping("/register")
public String register(@RequestBody UserDTO userDTO) {
if (StringUtils.isEmpty(userDTO.getName()) || StringUtils.isEmpty(userDTO.getPassword())) {
throw new BusinessException("100001", "用户名或密码不能为空");
}
return "注册成功:" + userDTO.toString();
}
}
- 创建UserDTO类
@Data
public class UserDTO {
private String name;
private String password;
}
- 测试
启动应用程序后,使用Postman等工具模拟访问http://localhost:8080/user/register接口,传入如下的JSON数据:
{
"name": "",
"password": "123456"
}
返回结果:
{
"code": "100001",
"message": "用户名或密码不能为空"
}
2. 模拟处理除零异常
步骤:
- 创建Controller类
@RestController
@RequestMapping("/divide")
public class DivideController {
@ApiOperation(value = "除法运算")
@GetMapping("/{dividend}/{divisor}")
public Map<String, Object> divide(@PathVariable int dividend, @PathVariable int divisor) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("result", dividend / divisor);
return result;
}
}
- 测试
启动应用程序后,使用Postman等工具模拟访问http://localhost:8080/divide/10/0接口。
返回结果:
{
"code":"500",
"message":"系统异常"
}
五、总结
本文详细介绍了Spring Boot中的异常处理机制,并且通过具体的示例演示了如何实现统一异常处理。掌握了Spring Boot的异常处理方法,将会对Web应用程序的开发和维护工作起到很大的帮助作用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot学习入门之统一异常处理详解 - Python技术站