若依框架的全局异常处理机制

若依框架(RuoYi)是一个基于 Spring Boot 的开源快速开发平台,它提供了完善的全局异常处理机制,能够统一处理应用程序中的异常,并返回友好的错误信息给前端。若依框架的全局异常处理机制主要基于 Spring 的 @ControllerAdvice@ExceptionHandler 注解实现。


若依框架的全局异常处理机制

1. 核心组件

若依框架的全局异常处理机制主要由以下组件构成:

  • GlobalExceptionHandler:全局异常处理器,使用 @ControllerAdvice@ExceptionHandler 注解捕获和处理异常。
  • AjaxResult:统一的响应结果封装类,用于返回 JSON 格式的错误信息。
  • 自定义异常类:若依框架定义了一些自定义异常类(如 CaptchaExceptionDemoModeException 等),用于处理特定的业务异常。

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. 异常处理流程
  1. 异常抛出

    • 在业务代码中,通过 throw new ServiceException("业务异常") 抛出异常。
    • 若依框架会自动捕获这些异常。
  2. 异常捕获

    • 全局异常处理器 GlobalExceptionHandler 会根据异常类型调用对应的 @ExceptionHandler 方法。
  3. 返回结果

    • 使用 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 封装统一的响应结果。
  • 提供友好的错误信息,便于前端展示。

通过这种机制,若依框架能够有效提高代码的健壮性和可维护性,同时为前端提供清晰的错误反馈。

### 若依框架前端全局异常处理实现 在若依框架中,为了实现在前端的全局异常处理机制,可以采用拦截器模式来捕获并处理来自服务器端响应中的错误信息。具体来说,在Vue.js环境中可以通过配置Axios库来进行统一管理。 #### 使用 Axios 进行请求拦截与响应拦截 对于每一个HTTP请求和接收到的服务端反馈,都可以设置相应的钩子函数用于预处理或后置操作: ```javascript // src/utils/request.js import axios from 'axios'; import { Message } from 'element-ui'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url timeout: 5000 // 请求超时时间 }); // request interceptor service.interceptors.request.use( config => { // Do something before request is sent if (store.getters.token) { // 让每个请求携带token-- ['X-Token']为自定义属性,请根据实际情况修改 config.headers['X-Token'] = getToken(); } return config; }, error => { // Do something with request error console.log(error); // for debug Promise.reject(error); } ); // response interceptor service.interceptors.response.use( /** * 如果您想获取http信息,如headers或status,则将参数response改为response.config */ response => { const res = response.data; // If the custom code is not 20000, it is judged as an error. if (res.code !== 20000) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }); // 50008:非法令牌;50012:其他客户端登录了; 50014:Token过期了; if (res.code === 50008 || res.code === 50012 || res.code === 50014) { MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { store.dispatch('user/resetToken').then(() => { location.reload(); }); }); } return Promise.reject(new Error(res.message || 'Error')); } else { return res; } }, error => { console.log('err' + error); // for debug Message({ message: error.message, type: 'error', duration: 5 * 1000 }); return Promise.reject(error); } ); export default service; ``` 上述代码片段展示了如何创建一个基于`axios`的对象,并为其添加两个重要的中间件——请求发送前(`request`) 和 接收回应之后 (`response`). 当遇到特定类型的错误码时会弹窗提示用户,并提供必要的交互选项给用户选择下一步动作[^1]. 此外,还可以考虑引入专门的状态管理和路由守卫逻辑来进一步完善整个应用级别的异常捕捉流程,确保即使是在未预期的情况下也能保持良好的用户体验和服务可用性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值