Umgang mit Fehlern

Beim Übergang eines Containers von einem Zustand in den anderen können unterschiedliche Fehler auftreten. Diese werden meist als Exception geworfen.

In dem Diagramm ist der allgemeine Ablauf dargestellt.

uml diagram

Diese Exception können bei der Programmierung durch einen try-/catch--Block abgefangen werden.

Bei der Verwendung des XML-Parsers kann das Verhalten bei einer Exception auch über die XML definiert werden.

In diesem Beispiel werden alle Exception vom Type \Alvine\Core\FrameworkException abgefangen und durch den Handler \Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway verworfen.

<transitions>
    <transition name="init" to="created" with="create">
        <exceptions>
            <exception match="\Alvine\Core\FrameworkException" >
                <handler class="\Alvine\Application\Workflow\Transition\Exception\Handler\ThrowAway" />
            </exception>
        </exceptions>
    </transition>
</transitions>

Jede Exception löst auch einen Event vom Typ \Alvine\Application\Workflow\Event\TransistionException aus. Dieser Event kann über die Automation abgefangen und verarbeitet werden.

In dem folgenden Beispiel wird der Container \Alvine\Application\Workflow\Container\Dataset verwendet.

<admission state="created" 
           container-class="\Alvine\Application\Workflow\Container\Dataset" />

Die Action MyCreateActionWithException wirft in diesem Beispiel eine Exception.

class MyCreateActionWithException extends \Alvine\Core\Alvine implements \Alvine\Application\Workflow\Action {

    public function run
        (\Alvine\Application\Workflow\Container $container):
    \Alvine\Application\Workflow\Container {

        /** Hier wird eine Exception geworfen, die abzufangen ist */
        throw new \Alvine\Core\FrameworkException('my exception');
    }

    public static function getInstanceFromParameterMap
        (\Alvine\Types\Map\ParameterMap $data):
    \Alvine\Application\Workflow\Action {
        return new static();
    }

}

Mit der Klasse DoSomething wird auf die Exception reagiert. Die Definition erfolgt in der XML im Abschnitt der Automatisierungsregeln. Die Regel catch-exception wird bei allen Übergängen aufgerufen.

<rule name="catch-exception" 
              on="\Alvine\Application\Workflow\Event\TransistionException">
            <conditions>    
                <condition class="\Alvine\Application\Workflow\Automation\Condition\IsExceptionInstanceOf" >
                    <parameters>
                        <parameter name="class">\Alvine\Core\FrameworkException</parameter>
                    </parameters>
                </condition>
            </conditions>
            <actions class="\MyNamespace\DoSomething">

            </actions>
</rule>

Sofern die Bedingung der Klasse \Alvine\Application\Workflow\Automation\Condition\IsExceptionInstanceOf erfüllt ist, wird die Automatisierungs-Aktion \MyNamespace\DoSomething ausgeführt.

class DoSomething extends \Alvine\Core\Alvine implements \Alvine\Application\Workflow\Automation\Action {

    public function execute(\Alvine\Application\Workflow\Automation\Rule $rule, \Alvine\Application\Workflow\Event $event): \Alvine\Application\Workflow\Automation\Action {

        // do something

        return $this;
    }

    public static function getInstanceFromParameterMap(\Alvine\Types\Map\ParameterMap $data): \Alvine\Application\Workflow\Automation\Action {
        return new static();
    }

}

Jetzt wird der Workflow initialisiert und gestartet.

$processor=(new \Alvine\Application\Workflow\Parser\XMLParser)->parse($xml);
$container=$processor->create();
$processor->run($container);
echo (string) $container;

Der Container gibt folgende Ausgabe

ID        : 98fcaa22-08d5-4713-d926-09999a75766c
State     : created
roundtrip : 2

⬤  2019-05-28 13:36:41 default        
        ▶ container created
▷  2019-05-28 13:36:41 default                   ⬤ ▬▶ created        
        ▶ container state changed from  to created
⚠  2019-05-28 13:36:41 default        
        ▶ Alvine\Core\FrameworkException: my exception