package com.ruoyi.common.core.service; /** * 模板模块被关闭时,访问模板能力的调用会抛出本异常。 * *

为什么需要它(而不是复用 {@code ServiceException})

* {@code ServiceException} 是 final 的(见 {@code com.ruoyi.common.exception.ServiceException}), * 既不能继承、也没有实现任何接口,因此无法用"子类 / 标记接口"做到精确捕获。 * 而本异常的关键用途恰恰是精确捕获: *
 * try {
 *     HeLibrary lib = templateFacade.findHeLibraryById(id);
 *     ...
 * } catch (TemplateModuleDisabledException e) {
 *     // 模板被关闭 —— 只跳过"取模板内容"这一段,随访主流程照常继续
 * }
 * 
* 如果改用 {@code ServiceException},调用方只能用 {@code catch (ServiceException e)} * 或比对 message 文本:前者会把别人的业务异常一起吞掉, * 后者会在改文案时静默失效。两者都是隐患,所以这里单独立一个类型。 * *

HTTP 路径上的表现

* 本异常是 {@link RuntimeException},会被 RuoYi 的全局异常处理器 * {@code GlobalExceptionHandler#handleRuntimeException} 捕获并原样返回 * {@code e.getMessage()},因此前端拿到的仍是明确的业务提示,不是"系统异常"。 * *

与 {@code TemplateAvailabilityInterceptor} 的分工

* * 两者文案一致(同一个常量),只是类型不同:一个是给 HTTP 调用方看的, * 一个是给 Java 调用方 catch 的。 * * @see com.ruoyi.template.api.TemplateFacade */ public class TemplateModuleDisabledException extends RuntimeException { private static final long serialVersionUID = 1L; public TemplateModuleDisabledException(String message) { super(message); } public TemplateModuleDisabledException(String message, Throwable cause) { super(message, cause); } }