如何防止错误处理的正交区域转换
How to prevent orthogonal region transition for error handling
我想使用 Boost MSM 创建以下状态机:
如果正交状态处于 "B",我希望能够阻止 Error
事件触发 AllOk + Error == InError
转换。例如,为所有正交状态指定转换会很好。类似于:
{AllOk, B} + Error == {AllOk, A}
但是,我找不到如何使用 Boost MSM 来实现它,也找不到使用常规 UML 命名法的方法,这让我觉得我走错了路。
是否有经典的"UML idiomatic"来处理这种行为?
我看到两个可能的解决方案:
- 在
AllOk + Error == InError
上设置守卫,检查另一个状态是否为 B
、like this response。
- 发送更具体的错误(在我的例子中,
CouldNotComputePath
,因为我正在为机器人编程),如果未处理,则以某种方式将其转换为 Error
。我不太确定该怎么做。
好的,我找到了解决方案:
Error事件可以在MainStateMachine中"catched"。如果不是,则在 MainStateMachine 上触发内部转换,这将发送 EnterError 事件以使另一个正交状态切换到 InError.
我想使用 Boost MSM 创建以下状态机:
如果正交状态处于 "B",我希望能够阻止 Error
事件触发 AllOk + Error == InError
转换。例如,为所有正交状态指定转换会很好。类似于:
{AllOk, B} + Error == {AllOk, A}
但是,我找不到如何使用 Boost MSM 来实现它,也找不到使用常规 UML 命名法的方法,这让我觉得我走错了路。
是否有经典的"UML idiomatic"来处理这种行为?
我看到两个可能的解决方案:
- 在
AllOk + Error == InError
上设置守卫,检查另一个状态是否为B
、like this response。 - 发送更具体的错误(在我的例子中,
CouldNotComputePath
,因为我正在为机器人编程),如果未处理,则以某种方式将其转换为Error
。我不太确定该怎么做。
好的,我找到了解决方案:
Error事件可以在MainStateMachine中"catched"。如果不是,则在 MainStateMachine 上触发内部转换,这将发送 EnterError 事件以使另一个正交状态切换到 InError.