Umgang mit Fehler¶
Auf Fehler kann nur eindeutig reagiert werden wenn der Status des Containers eindeutig ist.
Hier ist der Container auf dem Status a
und soll nach b
verschoben werden.
In dem Step doSomething
wird eine Exception geworfen. Es gibt eine Automation die auf TransistionException
in diesem Status reagiert.
<transition name="a-to-b" from="a" to="b" with="doSomething">
<exceptions>
<exception match="\Alvine\Core\FrameworkException">
<handler class="\Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway" />
</exception>
</exceptions>
</transition>
<rule on="\Alvine\Application\Workflow\Event\TransistionException">
<conditions>
<condition class="\Alvine\Application\Workflow\Automation\Condition\IsState">
<parameters>
<parameter name="state">a</parameter>
</parameters>
</condition>
</conditions>
<actions>
<action class="\Alvine\Application\Workflow\Automation\Action\DoTransition">
<parameters>
<parameter name="transition">to-exception</parameter>
</parameters>
</action>
</actions>
</rule>
Vorsicht beim Abfangen von Exceptions¶
Wenn eine Exception abgefangen wird und eine Automation verwendet wird, muss diese auch in den Rules berücksichtigt werden.
In diesem Beispiel wird bei dem Übergang a-to-b
eine Exception geworfen.
Durch das abfangen der Exception bleibt der Container im Status a
und die Automation greift wieder.
Wird das nicht über das Event \Alvine\Application\Workflow\Event\TransistionException
abgefangen ist das Resultat ist eine Endlosschleife
<rule on="\Alvine\Application\Workflow\Event\EndTransition">
<conditions>
<condition class="\Alvine\Application\Workflow\Automation\Condition\IsState">
<parameters>
<parameter name="state">a</parameter>
</parameters>
</condition>
</conditions>
<actions>
<action class="\Alvine\Application\Workflow\Automation\Action\DoTransition">
<parameters>
<parameter name="transition">a-to-b</parameter>
</parameters>
</action>
</actions>
</rule>
<rule on="\Alvine\Application\Workflow\Event\TransistionException">
<conditions>
<condition class="\Alvine\Application\Workflow\Automation\Condition\IsState">
<parameters>
<parameter name="state">a</parameter>
</parameters>
</condition>
</conditions>
<actions>
<action class="\Alvine\Application\Workflow\Automation\Action\DoTransition">
<parameters>
<parameter name="transition">to-exception</parameter>
</parameters>
</action>
</actions>
</rule>
<transition name="a-to-b" from="a" to="b" with="doSomething">
<exceptions>
<exception match="\Alvine\Core\FrameworkException">
<handler class="\Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway" />
</exception>
</exceptions>
</transition>
Mehrere Übergänge vom selben Status bei Automation¶
Wenn es mehrere Übergänge von a
gibt kann auf eine Exception in der Automation nicht reagiert werden.
Oft ist es so das ein andere Weg eingeschlagen werden muss wenn bei a-to-b
oder a-to-c
ein Fehler aufgetreten ist.
<transition name="a-to-b" from="a" to="b" with="doSomething">
<exceptions>
<exception match="\Alvine\Core\FrameworkException">
<handler class="\Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway" />
</exception>
</exceptions>
</transition>
<transition name="a-to-c" from="a" to="c" with="doSomethingElse">
<exceptions>
<exception match="\Alvine\Core\FrameworkException">
<handler class="\Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway" />
</exception>
</exceptions>
</transition>