我在我的c#GUI应用程序中使用状态机。有了这个,我有几个状态和一个名为ErrorHappened的状态。状态机可以从每个状态进入这些错误状态。但是使用这种架构我首先知道当状态机进入状态ErrorHappened时发生错误。
但是,在从一个状态A转换到状态B的过程中,如果发生错误,我该怎么办?问题是然后状态机从状态A进入状态B进入状态ErrorHappened。通常我会在完成向状态B的转换时执行操作。如果转换期间出错,我不会执行此操作。当然我可以引入像m_ErrorHappened这样的bool变量,但在我看来我有一个状态机,所以我不会被迫使用任何状态变量。
我希望解释清楚,足以提供任何帮助。
示例代码:
StateMachine sm; // initial state is state A
void AtoB() // executed during transition from A to B
{
if(DoSomething())
{
print("Error");
// Event ErrorHappened, state machine goes into state Error
sm.GotoState(ErrorHappened);
}
}
void TransitionEnd(State NewState)
{
if(NewState==B)
{
GreenLight();
}
if(NewState==Error)
{
RedLight();
}
}
main()
{
sm.GotoState(B);
}
现在当发生错误时,绿色然后红灯亮起。因为状态机从状态A进入状态B到错误状态。有没有办法检测到错误,只有红灯亮?
答案 0 :(得分:1)
您可能希望更改状态机设计,以便转换不会引发错误:保证转换在设计时没有错误。
与允许转换错误的模型相比,您必须添加更多状态和转换,但接下来会出现错误检测和错误处理的位置。
在这样的设计中,您将使用一般的转换机制,并且任何自定义处理程序都将与状态相关联,而您可能正在显示的是与转换关联的自定义处理程序(也可能是状态的通用处理程序,I不能从提供的代码中说出来。
例如,除了从A到B的转换之外,您可能还需要添加从A到某种错误状态的转换,其选择取决于A的自定义处理程序。或者,您可能在A和A之间引入状态。 B判断是否存在错误,如果不存在则转到B,否则转到错误状态。