Die Funktion ERRORSET nimmt eine Sonderstellung ein, weil sie festlegt, wo die Programmausführung nach dem Auftreten eines Fehlers fortgesetzt werden soll. Die folgenden Beispiele verdeutlichen die Bedeutung dieser Feststellung.
1. Beispiel
2. Beispiel
....
Das Aufrufsegment von ERRORSET ist jenes Segment, in das zurückgekehrt werden muss, wenn bei der zweiten Erarbeitung des ersten Arguments von ERRORSET ein Fehler auftritt. Alle im Keller über diesem Segment liegenden Aufrufsegmente sind aus dem Keller zu entfernen.
Für die sofortige Rückkehr in ein bestimmtes Aufrufsegment wird eine selten verwendete Technik verwendet, die eine lokal vereinbarte Prozedur mit einem Sprungbefehl kombiniert. Das Ziel des Sprungbefehls ist eine Marke, die im gleichen Vereinbarungsbereich steht wie die lokal vereinbarte Prozedur:
{ } procedure errorset (arg : reference; showErrorMessage : boolean; var res : reference); label 9; var localStack : reference; procedure errorHandler (errorID : errorCode); begin if showErrorMessage then reportError(errorID); reduceStackTo(localStack); goto 9; end; begin res := 0; localStack := stack; evaluate(arg, res, errorHandler); res := cons(res, 0); 9: end;
Besser (Hier wird das Paar, das das Ergebnis aufnehmen soll, vor der Auswertung des geschützten Ausdrucks bereitgestellt. Eine wirkliche Verbesserung ist das allerdings nicht.)
{ } procedure errorset (arg : reference; showErrorMessage : boolean; var res : reference); label 9; var localStack : reference; procedure errorHandler (errorID : errorCode); begin if showErrorMessage then reportError(errorID); reduceStackTo(localStack); res := 0; goto 99; end; begin res := 0; localStack := stack; res := cons(0, 0); evaluate(arg, pairs[res].car, errorHandler); 9: end;