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.
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