Как предотвратить переход ортогональной области для обработки ошибок

Я хочу создать следующий конечный автомат с Boost MSM:

Упрощенный автомат с ошибками в ортогональной области

Я хотел бы иметь возможность предотвратить событие Error для запуска перехода AllOk + Error == InError, если ортогональное состояние находится на «B». Например, было бы неплохо указать переход для всех ортогональных состояний. Что-то типа:

{AllOk, B} + Error == {AllOk, A}

Однако я не могу найти, как это сделать ни с Boost MSM, ни с обычной номенклатурой UML, что заставляет меня думать, что я иду неправильным путем.

Существует ли классическая «идиоматика UML» для такого поведения?

Я вижу два возможных решения:

  • Установите защиту на AllOk + Error == InError, которая проверяет, является ли другое состояние B, как этот ответ.
  • Отправить более конкретную ошибку (в моем случае CouldNotComputePath, так как я программирую робота), и как-то преобразовать ее в Error, если она не обрабатывается. Я не совсем уверен, как это сделать.

person Hugal31    schedule 04.05.2020    source источник


Ответы (1)


Хорошо, я нахожу решение:

Событие Error может быть "перехвачено" в MainStateMachine. Если это не так, на MainStateMachine инициируется внутренний переход, который отправит событие EnterError, чтобы перевести другое ортогональное состояние в InError. .

введите здесь описание изображения

person Hugal31    schedule 19.05.2020