Files
TerminalBasic/openspec/changes/phase-2-bytecode-vm/specs/vm-fehlerbehandlung/spec.md
Chili Palmer f7e57b0bd8 Phase 2 abgeschlossen: Bytecode, TBVM, Runtime-Scheibe, tbc run
- Sema zum Lowering-Pass umgebaut: typisiertes HIR (Slots, explizite
  Konvertierungsknoten) als Codegen-Eingabe; BYREF verlangt exakten Typ
- Bytecode-Feindesign umgesetzt: monomorpher Opcode-Satz,
  .tbc-Container (Formatversion 1) mit eigenem Writer/Reader
- Codegenerator HIR -> Bytecode (Fixup-Listen, keine globalen Passes)
- TBVM-Interpreter: Kontrollfluss, GOSUB-Stack je Frame, BYREF/BYVAL,
  STATIC, DEF FN, DATA/READ/RESTORE, ON [LOCAL] ERROR/RESUME/ERR/ERL,
  Breakpoints/Einzelschritt/Inspektion, STOP fortsetzbar
- Runtime-Scheibe: Host-Trait (Konsole/Capture), Builtin-Tabelle,
  Konvertierungsmatrix, PRINT-Formatierung/Druckzonen, Stringfunktionen
- tbc run/build/check mit Exit-Codes nach Entscheidung D6
- Korpus-Harness (byte-genauer Vergleich) + 3 neue Korpusdateien
  (konvertierung, fehlerbehandlung, byref); 137 Tests gruen
- Benchmarks: Einzelmodul 1,2 ms / Projekt 49.760 Zeilen 124 ms
  (Budgets eingehalten), VM ~5 Mio Schleifeniterationen/s
- Doku fortgeschrieben (tbvm-design, sprachreferenz, PLAN);
  verlagerte Punkte als explizite Aufgaben in Phase 3
- OpenSpec-Change phase-2-bytecode-vm (27/27 Tasks)

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

3.2 KiB

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.

ADDED 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