Files
Chili Palmer a6f005d023 OpenSpec: phase-2-bytecode-vm archiviert, Delta-Specs in Hauptspecs gesynct
- Neue Hauptspecs: bytecode-kompilat, vm-ausfuehrung,
  vm-fehlerbehandlung, konsolen-basisbibliothek
- Erweitert: sprach-frontend (Typisiertes HIR als Sema-Ausgabe),
  kompat-testkorpus (Laufzeitvergleich, Phase-2-Korpusabdeckung)
- Change nach openspec/changes/archive/2026-09-02-phase-2-bytecode-vm
  verschoben; openspec validate --all: 9/9

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 11:33:51 +02:00

3.3 KiB

vm-fehlerbehandlung Specification

Purpose

Die BASIC-Fehlersemantik (ON ERROR GOTO, ON LOCAL ERROR, RESUME, ERR/ERL) ist Teil des Kompatibilitätsvertrags: Programme des Vorbilds verlassen sich auf Handler-Scoping, Propagation und Wiederaufnahme exakt wie dokumentiert.

Requirements

Requirement: Handler-Scoping nach Vorbild

ON ERROR GOTO label SHALL einen modulweiten Handler aktivieren (auch wenn die Anweisung in einer Prozedur steht); ON LOCAL ERROR GOTO label SHALL einen prozedurlokalen Handler aktivieren, der den modulweiten für die Dauer des Prozedurlaufs verdeckt. ON [LOCAL] ERROR GOTO 0 deaktiviert den jeweiligen Handler. Tritt ein Fehler in einer Prozedur ohne zuständigen Handler auf, SHALL er die Aufrufkette hochpropagieren, bis ein aktiver Handler gefunden ist; ohne Handler bricht das Programm mit der Fehlermeldung und der Quellzeile ab.

Scenario: Modulweiter Handler fängt Prozedurfehler

  • WHEN das Hauptprogramm ON ERROR GOTO Fehler gesetzt hat und eine gerufene SUB Fehler 6 auslöst
  • THEN springt die Ausführung in den Handler Fehler und ERR ist 6

Scenario: Lokaler Handler verdeckt modulweiten

  • WHEN eine Prozedur ON LOCAL ERROR GOTO L gesetzt hat und in ihr ein Fehler auftritt
  • THEN behandelt L den Fehler, nicht der modulweite Handler

Scenario: Ohne Handler bricht das Programm ab

  • WHEN Fehler 9 ohne aktiven Handler auftritt
  • THEN endet das Programm mit der Meldung „Subscript out of range" und der Quellzeile

Requirement: ERR und ERL

Beim Eintritt in einen Handler SHALL ERR den Fehlercode liefern und ERL die zuletzt vor dem Fehler ausgeführte numerische Zeilennummer (0, wenn keine numerischen Zeilennummern durchlaufen wurden — alphanumerische Labels zählen nicht). ERROR n SHALL Fehler n künstlich auslösen und dieselbe Maschinerie durchlaufen.

Scenario: ERL bei Label-Programm

  • WHEN ein Programm ohne numerische Zeilennummern einen Fehler behandelt
  • THEN liefert ERL 0

Scenario: ERROR-Anweisung

  • WHEN ERROR 53 bei aktivem Handler ausgeführt wird
  • THEN wird der Handler mit ERR = 53 betreten

Requirement: RESUME-Semantik

Im Handler SHALL RESUME (bzw. RESUME 0) die fehlerauslösende Anweisung wiederholen, RESUME NEXT mit der Anweisung danach fortfahren und RESUME label an das Ziel springen. RESUME außerhalb einer aktiven Fehlerbehandlung MUST Fehler 20 „RESUME without error" auslösen. Nach RESUME gilt die Fehlerbehandlung als abgeschlossen (ERR wird zurückgesetzt).

Scenario: RESUME NEXT

  • WHEN ein Handler nach Fehler 11 (Division by zero) RESUME NEXT ausführt
  • THEN wird die auf die Division folgende Anweisung ausgeführt

Scenario: RESUME ohne Fehler

  • WHEN RESUME außerhalb eines Handlers ausgeführt wird
  • THEN tritt Laufzeitfehler 20 auf

Requirement: Fehler im Handler ist fatal

Tritt ein Fehler auf, während die Fehlerbehandlung aktiv ist (zwischen Handler-Eintritt und RESUME), SHALL das Programm ohne erneute Handler-Suche mit der Fehlermeldung abbrechen (keine Fehlerkaskaden, Verhalten des Vorbilds).

Scenario: Kein Kaskadieren

  • WHEN im aktiven Handler selbst Fehler 6 auftritt
  • THEN bricht das Programm mit „Overflow" ab, auch wenn ein Handler registriert ist