Обработка ошибок при использовании конечного автомата

Я использую конечный автомат для моего приложения 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, если нет, а в противном случае в состояние ошибки.

Другие вопросы по тегам