Fehlschläge sind der Kontrollfluss in Verse.
Im Gegensatz zu anderen Programmiersprachen, welche die booleschen Werte „true“ und „false“ verwenden, um den Ablauf eines Programms zu steuern, verwendet Verse Ausdrücke, die entweder erfolgreich sein oder fehlschlagen können. Diese Ausdrücke werden fehlbare Ausdrücke genannt. Sie können nur in einem Fehlerkontext ausgeführt werden.
Die Verwendung von Fehlschlägen für den Steuerungsablauf bedeutet, dass die Arbeit nicht dupliziert werden muss und dass du subtile Fehler vermeiden kannst.
In anderen Sprachen musst du zum Beispiel prüfen, ob ein Index für ein Array gültig ist, bevor du auf das Array-Element bei diesem Index zugreifen kannst. Dies ist eine häufige Fehlerquelle.
In Verse werden Validierung und Zugriff kombiniert, um dies zu vermeiden.
Zum Beispiel:
if (Element := MyArray[Index]):
Log(Element)
Fehlbarer Ausdruck
Ein fehlbarer Ausdruck ist ein Ausdruck, der entweder erfolgreich ist und einen Wert zurückgibt oder aber fehlschlägt und keinen Wert zurückgibt. Beispiele für fehlbare Ausdrücke sind die Indizierung in einem Array, da ein ungültiger Index fehlschlägt, und die Verwendung von Operatoren wie dem Vergleich zweier Werte.
Code, den du schreibst, ist standardmäßig nicht fehlbar. Um beispielsweise eine Funktion zu schreiben, die fehlschlagen kann, musst du der Funktionsdefinition den Effekt Bezeichner <decides> hinzufügen. Derzeit ist es auch notwendig, <transacts> hinzuzufügen, wenn <decides> verwendet wird.
Eine vollständige Liste der fehlbaren Ausdrücke findest du in der Liste von Ausdrücken in Verse.
Fehlerkontext
Ein Fehlerkontext ist ein Kontext, in dem fehlbare Ausdrücke ausgeführt werden dürfen. Der Kontext definiert, was passiert, wenn der Ausdruck fehlschlägt. Jeder Fehlschlag innerhalb eines Fehlerkontexts führt dazu, dass der gesamte Kontext fehlschlägt.
Mit einem Fehlerkontext können verschachtelte Ausdrücke Fehlerausdrücke sein, wie zum Beispiel Funktionsargumente oder Ausdrücke in einem block-Ausdruck.
Ein nützlicher Aspekt von Fehlerkontexten in Verse ist, dass sie eine Form der spekulativen Ausführung darstellen, dass du also Aktionen ausprobieren kannst, ohne sie festzulegen. Wenn ein Ausdruck erfolgreich ist, werden die Auswirkungen des Ausdrucks festgelegt, z. B. Ändern des Werts einer Variablen. Wenn der Ausdruck fehlschlägt, werden seine Auswirkungen zurückgenommen, als wäre der Ausdruck nicht eingesetzt worden.
So kannst du eine Reihe von Aktionen ausführen, deren Änderungen akkumuliert werden, die jedoch zurückgenommen werden, wenn sie irgendwo fehlschlagen.
Damit dies funktioniert, müssen alle Funktionen, die im Fehlerkontext aufgerufen werden, den Effektbezeichner <transacts> haben, und der Compiler wird sich beschweren, wenn dies nicht den Fall ist.
Benutzerdefinierte Funktionen haben standardmäßig kein transacts-Effekt. Ihren Definitionen muss ein expliziter <transacts>-Bezeichner hinzugefügt werden. Einige native Funktionen haben auch nicht den transacts-Effekt und können in Fehlerkontexten nicht aufgerufen werden.
Beispiel für eine native Funktion ohne transacts: Audiokomponente mit BeginSound()-Methode. Wenn der Ton gestartet wird, kann er auch dann noch wiedergegeben werden, wenn er gestoppt wird.
Die folgende Liste enthält alle Fehlerkontexte in Verse:
-
Bedingung in
if-Ausdrücken.if (test-arg-block) { … } -
Iterations- und Filterausdrücke in
for-Ausdrücken. Beachte, dassforinsofern eine Ausnahme ist, als es für jede Iteration einen Fehlerkontext erstellt. Wenn Iterationen geschachtelt sind, dann sind auch die Fehlerkontexte geschachtelt. Wenn ein Ausdruck fehlschlägt, wird der innerste Fehlerkontext abgebrochen, und die umschließende Iteration, falls vorhanden, wird mit der nächsten Iteration fortgesetzt.for (Item : Collection, test-arg-block) { … } -
Der Körper einer Funktion oder Methode, die den Effektbezeichner
<decides>hat.IsEqual()<decides><transacts> : void = { … } -
Operand für den Operator
not.not expression -
Linker Operand für
or.expression1 or expression2 -
Initialisieren einer Variablen des Typs
option.option{expression}