使用状态机时的错误处理
Error handling when using a state machine
我为我的 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 再到错误状态。有没有办法检测到错误,只有红灯亮?
您可能想要更改状态机设计,以便转换不会引发错误:设计保证转换无错误。
与允许转换错误的模型相比,您将不得不添加更多的状态和转换,但这就是您的错误检测和错误处理的去向。
在这样的设计中,您将使用通用的转换机制,并且任何自定义处理程序都将与状态相关联,而您展示的可能是与转换相关联的自定义处理程序(并且可能是状态的通用处理程序,我不能从提供的代码中说出来)。
例如,除了从 A 到 B 的转换之外,您可能还需要添加从 A 到某个错误状态的转换,选择取决于 A 的自定义处理程序。或者,您可以在两者之间引入一个状态A 和 B 决定是否有错误,如果没有则转到 B,否则转到错误状态。
我为我的 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 再到错误状态。有没有办法检测到错误,只有红灯亮?
您可能想要更改状态机设计,以便转换不会引发错误:设计保证转换无错误。
与允许转换错误的模型相比,您将不得不添加更多的状态和转换,但这就是您的错误检测和错误处理的去向。
在这样的设计中,您将使用通用的转换机制,并且任何自定义处理程序都将与状态相关联,而您展示的可能是与转换相关联的自定义处理程序(并且可能是状态的通用处理程序,我不能从提供的代码中说出来)。
例如,除了从 A 到 B 的转换之外,您可能还需要添加从 A 到某个错误状态的转换,选择取决于 A 的自定义处理程序。或者,您可以在两者之间引入一个状态A 和 B 决定是否有错误,如果没有则转到 B,否则转到错误状态。