Fehlerbehandlung innerhalb von Arbeitsabläufen
Modellieren eines Fehler-Status
Um einen Fehler-Status zu modellieren, muss lediglich ein normaler Status im Modell hinzugefügt und anschließend in den Status Eigenschaften der Typ „Fehler“ aktiviert werden. Der Status wird anschließend im Modell mit einem roten Rand angezeigt.
Der Fehler-Status darf nicht über eine Transition geschaltet werden, besitzt also analog zum Startstatus nur ausgehende Transitionen. Über diese ausgehenden Transitionen wird die Fehlerbehandlung innerhalb des Arbeitsablaufs modelliert.
Tritt nun an einer beliebigen Stelle im Arbeitsablauf ein Fehler bzw. eine Exception auf, erreicht die Instanz des Arbeitsablaufs direkt den Fehler-Status. Der Fehler-Status fängt alle Exceptions ab, die innerhalb der Ausführung des Arbeitsablaufs auftreten, auch solche, die nicht innerhalb des Arbeitsablaufs behandelt werden. Nach der Fehlerbehebung kann der Arbeitsablauf in den nachfolgenden Status (lt. Arbeitsablauf-Modell) weitergeschaltet werden.
Beispiel: Arbeitsablauf „Error“
Der Beispiel-Arbeitsablauf „Error“ besteht aus dem Arbeitsablauf „errortest“ und den zugehörigen Skripten „errorshow“, „errortest1“ und „errortest2“. Der Arbeitsablauf wird als komprimierte Zip-Datei zum Import in die Vorlagen-Verwaltung (Knoten „Arbeitsabläufe)“ zur Verfügung gestellt.
Skript: errortest1:
//!Beanshell
throw new IllegalArgumentException("Error test 1");
Das erste Skript „errortest1“ wirft eine unbehandelte IllegalStateException. Diese Exception wird im Arbeitsablauf nicht behandelt, führt aber trotzdem dazu, dass nicht der Status „ende“, sondern der Status „Error“ erreicht wird.
Skript errortest2:
//!Beanshell
context.gotoErrorState("Error test 2", new IllegalArgumentException("Error test 2"));
Das zweite Skript „errortest2“ zeigt die Fehlerbehandlung innerhalb eines Skripts. Über context.gotoErrorState(...) (siehe auch FirstSpirit Access-API, Interface Task) wird die Instanz des Arbeitsablaufs beim Auftreten einer Exception direkt in den Status Error geschaltet.
Skript errorshow:
import de.espirit.firstspirit.common.gui.*;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.ui.operations.RequestOperation;
import de.espirit.firstspirit.agency.OperationAgent;
errorInfo = context.getTask().getErrorInfo();
if (errorInfo != null) {
text = new StringBuilder("<html>Fehlerinformationen:<br>");
text.append("<ul>");
text.append("<li>Benutzer: " + errorInfo.getUserLogin() + " (" + errorInfo.getUserName() + ")");
text.append("<li>Kommentar: " + errorInfo.getComment());
text.append("<li>Aktivität: " + errorInfo.getErrorActivity());
text.append("<li>Error: " + errorInfo.getThrowable());
text.append("<li>ErrorInfo: " + errorInfo.getErrorInfo());
text.append("</ul>");
text = text.toString();
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.INFO);
requestOperation.addOk();
requestOperation.perform(text);
} else {
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.INFO);
requestOperation.perform("Es sind keine Fehlerinformationen vorhanden.");
}
context.doTransition("->Main");
Das Skript „errorshow“ blendet die Fehlerinformationen über einen Fehlerdialog ein. Beim Auftreten eines Fehlers wird der Dialog im Rahmen der Fehlerbehandlung automatisch über den Arbeitsablauf aufgerufen. Der Dialog enthält relevante Informationen zur Fehlerbehebung (z. B. den Benutzer, der den Arbeitsablauf gestartet hat, die Aktivität, die zum Fehler geführt hat, usw.):
Nach Einblenden des Dialogs wird die Instanz des Arbeitsablaufs automatisch auf den Status „Main“ zurückgeschaltet: