若依框架(RuoYi)是一个基于 Spring Boot 的开源快速开发平台,它提供了完善的全局异常处理机制,能够统一处理应用程序中的异常,并返回友好的错误信息给前端。若依框架的全局异常处理机制主要基于 Spring 的 @ControllerAdvice
和 @ExceptionHandler
注解实现。
若依框架的全局异常处理机制
1. 核心组件
若依框架的全局异常处理机制主要由以下组件构成:
GlobalExceptionHandler
:全局异常处理器,使用@ControllerAdvice
和@ExceptionHandler
注解捕获和处理异常。AjaxResult
:统一的响应结果封装类,用于返回 JSON 格式的错误信息。- 自定义异常类:若依框架定义了一些自定义异常类(如
CaptchaException
、DemoModeException
等),用于处理特定的业务异常。
2. 全局异常处理器(GlobalExceptionHandler
)
若依框架的全局异常处理器位于 com.ruoyi.framework.web.exception
包中,核心代码如下:
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 处理业务异常
*/
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e) {
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
/**
* 处理自定义异常
*/
@ExceptionHandler(CustomException.class)
public AjaxResult handleCustomException(CustomException e) {
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
/**
* 处理验证码异常
*/
@ExceptionHandler(CaptchaException.class)
public AjaxResult handleCaptchaException(CaptchaException e) {
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
/**
* 处理演示模式异常
*/
@ExceptionHandler(DemoModeException.class)
public AjaxResult handleDemoModeException(DemoModeException e) {
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
/**
* 处理所有未捕获的异常
*/
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e) {
log.error(e.getMessage(), e);
return AjaxResult.error("系统错误,请联系管理员");
}
}
3. 统一响应结果封装(AjaxResult
)
若依框架使用 AjaxResult
类封装统一的响应结果,核心代码如下:
public class AjaxResult extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public static final String CODE_TAG = "code";
public static final String MSG_TAG = "msg";
public static final String DATA_TAG = "data";
/**
* 返回成功结果
*/
public static AjaxResult success() {
return success("操作成功");
}
/**
* 返回成功结果(带消息)
*/
public static AjaxResult success(String msg) {
AjaxResult result = new AjaxResult();
result.put(CODE_TAG, HttpStatus.SUCCESS);
result.put(MSG_TAG, msg);
return result;
}
/**
* 返回错误结果
*/
public static AjaxResult error() {
return error("操作失败");
}
/**
* 返回错误结果(带消息)
*/
public static AjaxResult error(String msg) {
AjaxResult result = new AjaxResult();
result.put(CODE_TAG, HttpStatus.ERROR);
result.put(MSG_TAG, msg);
return result;
}
}
4. 自定义异常类
若依框架定义了一些自定义异常类,用于处理特定的业务异常。例如:
ServiceException
:业务异常。CaptchaException
:验证码异常。DemoModeException
:演示模式异常。
这些异常类通常继承自 RuntimeException
,核心代码如下:
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L;
public ServiceException(String message) {
super(message);
}
}
5. 异常处理流程
-
异常抛出:
- 在业务代码中,通过
throw new ServiceException("业务异常")
抛出异常。 - 若依框架会自动捕获这些异常。
- 在业务代码中,通过
-
异常捕获:
- 全局异常处理器
GlobalExceptionHandler
会根据异常类型调用对应的@ExceptionHandler
方法。
- 全局异常处理器
-
返回结果:
- 使用
AjaxResult
封装错误信息,并返回 JSON 格式的响应。
- 使用
6. 示例
假设在业务代码中抛出一个 ServiceException
:
public void doSomething() {
if (someCondition) {
throw new ServiceException("业务异常");
}
}
当该异常被抛出时,GlobalExceptionHandler
会捕获并处理:
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e) {
log.error(e.getMessage(), e);
return AjaxResult.error(e.getMessage());
}
最终返回给前端的 JSON 响应如下:
{
"code": 500,
"msg": "业务异常"
}
总结
若依框架的全局异常处理机制通过 @ControllerAdvice
和 @ExceptionHandler
实现了统一的异常捕获和处理。其核心特点包括:
- 支持自定义异常类,便于处理特定的业务异常。
- 使用
AjaxResult
封装统一的响应结果。 - 提供友好的错误信息,便于前端展示。
通过这种机制,若依框架能够有效提高代码的健壮性和可维护性,同时为前端提供清晰的错误反馈。