Обработка ошибок при использовании конечного автомата
Я использую конечный автомат для моего приложения C# GUI. При этом у меня есть несколько состояний и одно состояние под названием ErrorHappened. Конечный автомат может перейти из каждого состояния в состояние ошибки. Но используя эту архитектуру, я сначала знаю, что произошла ошибка, когда конечный автомат переходит в состояние ErrorHappened.
Но что я могу сделать, когда при переходе из одного состояния A в состояние B происходит ошибка? Проблема заключается в том, что конечный автомат переходит из состояния A в состояние B в состояние ErrorHappened. Обычно я выполняю действие, когда переход в состояние B завершен. Я бы не стал выполнять это действие, если во время перехода произошла ошибка. Конечно, я мог бы ввести переменную bool, такую как 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 в состояние ошибки. Есть ли способ, чтобы ошибка была обнаружена и загорелся только красный свет?
1 ответ
Возможно, вы захотите изменить конструкцию конечного автомата, чтобы переходы не могли вызывать ошибки: чтобы переход гарантированно был свободен от ошибок.
По сравнению с моделью, которая допускает ошибки при переходе, вам нужно будет добавить больше состояний и переходов, но тогда вам нужно будет обнаружить и обработать ошибки.
В такой конструкции вы бы использовали общий механизм перехода, и любые пользовательские обработчики были бы связаны с состояниями, тогда как, возможно, вы показываете пользовательские обработчики, связанные с переходами (и, возможно, универсальные обработчики для состояний, я не могу сказать из предоставленный код).
Например, вам может потребоваться добавить переход от A к некоторому состоянию ошибки в дополнение к переходу от A к B, причем выбор зависит от пользовательского обработчика для A. В качестве альтернативы вы можете ввести состояние между A и B, которое решает если есть ошибка, и переходит в B, если нет, а в противном случае в состояние ошибки.