Umgang mit Fehler

siehe auch

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>