如何检测变量激活顺序并处理触发顺序回退的异常问题
变量激活顺序检测系统实现方案
核心用阶段状态机实现,完全匹配你提的所有规则,无需复杂逻辑:
预定义基础配置
先将激活顺序映射为阶段枚举,搭配你定义的布尔变量使用:
// 按激活顺序排列的阶段枚举 typedef enum { STAGE_WAIT_FIRST, STAGE_WAIT_SECOND, STAGE_WAIT_THIRD, STAGE_FINISHED } CheckStage; // 全局/类内持久化状态 CheckStage currentStage = STAGE_WAIT_FIRST; bool firstCheck = false; bool secondCheck = false; bool thirdCheck = false;
核心检查逻辑
每次需要校验变量激活状态时调用该函数即可,完全符合你提的规则:
- 匹配当前阶段的变量激活后,自动重置该变量为
false,进入下一阶段 - 非当前阶段的变量触发
true直接判定为顺序回退异常 - 全流程激活完成后自动执行目标代码,同时重置状态机准备下一轮检测
void checkActivationOrder() { switch(currentStage) { case STAGE_WAIT_FIRST: if (secondCheck || thirdCheck) { // 顺序回退异常处理逻辑写在这里 doErrorHandle("顺序异常:未完成firstCheck前触发后续检查项"); resetStateMachine(); return; } if (firstCheck) { firstCheck = false; currentStage = STAGE_WAIT_SECOND; } break; case STAGE_WAIT_SECOND: if (firstCheck || thirdCheck) { doErrorHandle("顺序异常:等待secondCheck阶段触发非法检查项"); resetStateMachine(); return; } if (secondCheck) { secondCheck = false; currentStage = STAGE_WAIT_THIRD; } break; case STAGE_WAIT_THIRD: if (firstCheck || secondCheck) { doErrorHandle("顺序异常:等待thirdCheck阶段触发非法检查项"); resetStateMachine(); return; } if (thirdCheck) { thirdCheck = false; currentStage = STAGE_FINISHED; } break; default: break; } // 全流程激活完成,执行业务代码 if (currentStage == STAGE_FINISHED) { doTargetBusinessLogic(); resetStateMachine(); } } // 状态机重置复用函数 void resetStateMachine() { currentStage = STAGE_WAIT_FIRST; firstCheck = false; secondCheck = false; thirdCheck = false; }
异常场景匹配验证
你举的回退异常场景可以完美覆盖:当firstCheck、secondCheck依次激活后,状态机进入STAGE_WAIT_THIRD阶段,所有布尔变量已被重置为false;此时如果secondCheck再次被触发为true,进入检查函数后会直接命中STAGE_WAIT_THIRD分支的异常判定逻辑,触发异常处理。
内容的提问来源于stack exchange,提问作者AndromedaHelix
相关产品推荐
相关产品推荐

