2

我为我的 c# GUI 应用程序使用状态机。有了这个,我有几个状态和一个名为 ErrorHappened 的状态。状态机可以从每个状态进入这些错误状态。但是使用这种架构,我首先知道当状态机进入 ErrorHappened 状态时发生了错误。

但是,当从一个状态 A 转换到一个状态 B 的过程中发生错误时,我该怎么办?问题是状态机从状态 A 进入状态 B 进入状态 ErrorHappened。通常,当转换到状态 B 完成时,我会执行一个操作。如果在转换过程中出现错误,我不会执行此操作。当然,我可以引入一个像 m_ErrorHappened 这样的布尔变量,但我认为我有一个状态机,所以我不会被迫使用任何状态变量。

我希望解释足够清楚以提供任何帮助。

示例代码:

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 再到错误状态。有没有办法检测到错误并且只有红灯亮?

4

1 回答 1

2

您可能希望更改状态机设计,以使转换不会引发错误:通过设计保证转换不会出错。

与允许转换错误的模型相比,您将不得不添加更多状态和转换,但这就是您的错误检测和错误处理的地方。

在这样的设计中,您将使用通用转换机制,并且任何自定义处理程序都将与状态相关联,而您所展示的可能是与转换相关联的自定义处理程序(也许是状态的通用处理程序,我不能说提供的代码)。

例如,除了从 A 到 B 的转换之外,您可能需要添加从 A 到某个错误状态的转换,其选择取决于 A 的自定义处理程序。或者,您可以在 A 和 B 之间引入一个状态来决定如果有错误,则进入 B,否则进入错误状态。

于 2015-06-11T20:09:16.223 回答