Zum Inhalt springen

Gambas: Fehlerbehandlung

Aus Wikibooks


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