Beim ersten Start eines Programms gibt es noch keine Highscore-Datei, kein Settings-File, keinen Cache. Das Programm versucht zu lesen, MMBasic kracht raus, fertig. Lange habe ich solche Fälle mit MM.INFO(EXISTS file$) vorgeprüft, was funktioniert, aber drei Codezeilen für jeden Filezugriff bedeutet. Mit ON ERROR SKIP ist es deutlich kompakter.

Die Idee

ON ERROR SKIP weist MMBasic an, beim nächsten Fehler nicht abzubrechen, sondern weiterzulaufen. MM.ERRNO enthält danach den Fehlercode (0 bedeutet kein Fehler). Mit der Kombination kann man eine Datei einfach versuchen zu öffnen und am MM.ERRNO-Wert ablesen, ob es geklappt hat.

SUB LoadHighscores()
  LOCAL INTEGER i, score, lv
  LOCAL STRING name$

  ON ERROR SKIP
  OPEN "highscores.dat" FOR INPUT AS #1

  IF MM.ERRNO = 0 THEN
    FOR i = 0 TO 9
      INPUT #1, name$, score, lv
      hs_names$(i) = name$
      hs_scores(i) = score
      hs_levels(i) = lv
    NEXT i
    CLOSE #1
  ELSE
    SaveHighscores()  ' Datei anlegen mit Default-Werten
  END IF

  ON ERROR ABORT
END SUB

Wenn die Datei existiert und lesbar ist, wird sie gelesen. Wenn nicht, fällt das Programm nicht um, sondern legt sie mit Defaults an. Beim nächsten Start ist sie da, und der Pfad ist eingeschwungen.

Wichtig: ON ERROR ABORT am Ende

ON ERROR SKIP gilt nicht nur für die nächste Zeile, sondern bleibt aktiv, bis es zurückgesetzt wird. Wer das vergisst, frisst alle weiteren Fehler still und sucht später lange, warum etwas nicht funktioniert. Mein Default ist, am Ende der SUB ausdrücklich ON ERROR ABORT zurückzusetzen, damit der normale Abbruch-Modus wieder greift.

Wenn nur eine einzelne Zeile geschützt sein soll

ON ERROR SKIP deckt nur die nächste Anweisung. Wer also gezielt nur eine Zeile zu schützen hat, schreibt es direkt davor und braucht hinterher kein ABORT:

ON ERROR SKIP
KILL "tempfile.tmp"
' KILL fängt einen Fehler ab, falls die Datei nicht existiert
' Danach läuft alles normal weiter, ohne ON ERROR ABORT

Das ist die kompakte Variante für Aufräumarbeiten, bei denen es keine Rolle spielt, ob die Datei vorher schon weg war.

Beide Varianten haben mir die MM.INFO(EXISTS …)-Vorprüfung in den meisten Fällen erspart. Der Code liest sich näher an dem, was er meint: „versuche zu lesen, fall um falls Du musst". Genau das ist das Schöne an Error-Handling, wenn die Sprache es richtig macht.