Ich habe mich jetzt mal etwas intensiver in das Thema eingelesen. Das Thema ist schon sehr vielfältig. Ich habe jetzt mal ein einfach zu handhabendes Szenario als Bsp. erstellt.
Grundsätzlich gibt es ja 2 Möglichkeiten:
a) Ich lasse das Programm/die Funktion in einen Fehler laufen und fange diesen dann ab
b) Ich prüfe vor Ausführung ob z.B. Parameter fehlerhaft sind und generiere sofort selbst einen Fehler, der dann im Errorhandling weiter bearbeitet wird.
Hier soll z.B. eine Datei eingelesen werden. Ich prüfe jetzt vorher, ob sie überhaupt existiert und generiere einen Fehler, falls nicht. Wenn Prozeduren Fehler generieren, ist die Art des Fehlers in den entsprechenden Modulen vermerkt (IOError, wImageError, ..). Fehler enden immer auf ..Error.
Meine Dateiprüfung liefert aber keinen Fehler, sondern true/false. Somit ist es erforderlich einen eigenen Fehlertyp zu erstellen, dem ich dann auch einen entsprechenden Text beim Setzen mitgebe.
Falls z.B. ein Dateihandle existiert, weil eine Datei zum Schreiben geöffnet wurde und dort ein Fehler auftrat, muss dem "except:" ein "finally:" folgen mit (in diesem Fall) close(f). Wichtig!: Der finally-Zweig wird IMMER ausgeführt (unabhängig ob Fehler oder nicht), also muss diese Aktion auch ausführbar sein und nicht selbst in einen Fehler laufen.
import os
type
FileExistsError* = object of Exception # User-exeption, muss auf "..Error" enden!
let datei = r".\gibt-es-nicht.txt"
try:
if not fileExists(datei): # wenn Datei nicht existiert wird eine exception generiert (vergleichbar mit "[au3] SetError()")
raise newException(FileExistsError, "FILE DOESN'T EXIST")
else:
echo readFile(datei)
except FileExistsError: # wenn FileExistsError auftritt (vergleichbar mit "[au3] If @error"):
echo getCurrentExceptionMsg()
Alles anzeigen
Doku: Raise & Try
P.S.
Falls ihr noch weitere Bsp. zum Errorhandling habt, bitte hier posten. Das Thema ist so komplex, da ist eine Sammlung sicher hilfreich.