Gambas: Fehlerbehandlung
Zurück zu Gambas
Fehler abfangen mit Catch
[Bearbeiten]Der Befehl CATCH markiert den Beginn einer Fehlerroutine innerhalb einer Funktion oder einer Procedure.
Der Catch-Teil wird immer dann ausgeführt, wenn ein Fehler bei der Ausführung der Funktion auftritt.
Der Fehler kann innerhalb der Prozedur selber auftreten oder aber in einer anderen Funktion, die aus der Prozedur heraus aufgerufen wurde. Dies gilt allerdings nur unter der Voraussetzung, dass die aufgerufene Funktion selber keinen CATCH-Befehl enthält.
Je tiefer der Catch-Teil zu finden ist, desto größere Priorität hat er.
Wenn ein Fehler im Catch-Teil selber auftaucht, dann wird er nicht korrigiert. Der Catch-Teil schützt sich also nicht selber.
Falls ein Finally-Teil in der Funktion auftaucht, muss er dem Catch-Teil vorausgehen.
Siehe FINALLY.
Beispiel 1
[Bearbeiten]Das Programm speichert der Inhalt der Textarea als Datei. Die Fehlerroutine fängt den Abbrechen Befehl im Dateiauswahldialog ab.
Sie brauchen eine Textarea und einen Befehlsbutton auf Ihrer Form, um das Programm in Gang zu bringen.
Der Code:
[Bearbeiten]PUBLIC SUB Form_Open() Textarea1.Text = "Dies ist ein Test" END PUBLIC SUB Button1_Click() Dialog.SaveFile() File.Save(Dialog.Path, TextArea1.Text) CATCH IF Error THEN RETURN END
Siehe auch Gambas:_Dateien#Datei_speichern
Beispiel 2
[Bearbeiten]Sie haben ein Programm geschrieben, welches die Kreisfläche aus dem Radius berechnen soll. Sie wollen verhindern, dass in die Textbox mit der Radiuseingabe etwas anderes als eine Zahl eingegeben wird. Dazu ergänzen Sie Ihren Code durch eine Fehlerroutine mit CATCH.
CATCH message.Info("Bitte eine Zahl eingeben") END
Das komplette Programm schaut so aus:
Sie brauchen:
- 2 Textboxen
- 1 Befehlsbutton
- 1 Labelfeld
umd das Programm in Gang zu bringen.
Der Code
[Bearbeiten]PUBLIC SUB Form_Open() Textbox1.Text = "" Textbox2.Text = "" Button1.Text = "Kreisberechnung mit dem Radius:" Label1.Text = "Fläche:" Label1.Alignment = 66 END PUBLIC SUB Button1_Click() r AS Float F AS Float IF Textbox1.Text = "" THEN r = 0 Textbox1.Text = Str(0) ELSE r = Val(textbox1.text) ENDIF F = Pi*r^2 Textbox2.Text = Str(Round(F,-2)) CATCH message.Info("Bitte eine Zahl eingeben") END
Probieren Sie ganz bewußt eine Fehleingabe aus. Geben Sie im Feld für den Radius einen Buchstaben ein. Was passiert dann? Jetzt versuchen Sie dasselbe noch einmal und schalten die Fehlerroutine CATCH nach Markierung mit der rechten Maustaste und Block auskommentieren ab.
Beispiel 3
[Bearbeiten]Das folgende Beispiel zeigt einen etwas komplizierten Code aus der Gambashilfe.
Beispiel:
' Print a file to the screen SUB PrintFile(FileName AS STRING) DIM hFile AS File DIM sLig AS STRING OPEN FileName FOR READ AS #hFile WHILE NOT EOF(hFile) LINE INPUT #hFile, sLig PRINT sLig WEND FINALLY ' Always executed, even if a error raised CLOSE #hFile CATCH ' Executed only if there is an error PRINT "Cannot print file "; FileName END
Fehler abfangen mit TRY
[Bearbeiten]Try ist im Grunde genommen dasselbe wie Catch, nur dass hierbei nicht die gesamte Funktion nach Fehlern geprüft wird, sondern nur eine spezielle Anweisung.
Beispiel
[Bearbeiten]In diesem Beispiel wird eine Datei in dem Homeverzeichnis des aktuellen Users erstellt. Wenn der Zugriff zu dem Zielort allerdings gesperrt ist (z.b. wenn die Datei oder das Verzeichnis read-only ist), wirft die Try-Anweisung einen Error, der durch das Schlüsselwort ERROR überprüft werden kann.
PUBLIC SUB Main() TRY File.Save("/home/" & User.Name & "/file.txt", "Hallo " & User.Name) IF ERROR THEN PRINT "Folgender Fehler ist aufgetreten: " & Error.Text PRINT "Und zwar genau hier: " & Error.Where ELSE PRINT "Ich habe erfolgreich eine Datei in deinem Homeverzeichnis erstellt!" ENDIF END