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 端点(66 个模板管理接口):由 {@code TemplateAvailabilityInterceptor}
* 拦截,抛的是 {@code ServiceException} —— 与满意度/出入院/宣教模块完全一致,刻意不改;
* - 跨模块调用(门面):抛本异常,供调用方精确降级。
*
* 两者文案一致(同一个常量),只是类型不同:一个是给 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);
}
}