StarBasic - Allgemein
Wie kann man Fehler abfangen?
Fehlerbehandlung ist eine der wichtigen Aufgaben in einem Programm. Sie dient dazu
möglich
Fehler während der Laufzeit in der Anwendung und des Anwender abzufangen. Für diese
Fehlerbehandlung stellt StarBasic besondere Funktionen zur Verfügung.
On Error
Mit On Error beginnt jede Fehlerroutine. Mit dieser Anweisung wird die mögliche
Fehlerbehandlung eingeleitet. Mögliche Fehlerbehandlung? Weil natürlich nicht alle Fehler
abgefangen werden können. Es können nur Fehler abgefangen werden für StarBaisc einen
Errorhandling bereitstellt. Desweiteren ist die Fehlerbehandlung im Kern nur eine Variante des
Goto-Befehls und mit der entsprechenden Vorsicht zu verwenden.
On Error Goto Sprungziel
Um jetzt diese Sprungziel festzulegen wird dieselbe Logik verwendet wie bei Goto.
Basic
Sub Test
Anweisung
Anweisung
On Error Goto Fehlerbehandlung
Anweisung
Exit Sub
Fehlerbehandlung:
Anweisung
End SubZusätzlich kann man noch festlegen wie das Programm nach der Fehlerbearbeitung
weiterarbeiten soll. Dazu wird der Befehl Resume verwendet. Dieser kann auf zwei Arten
eingesetzt werden. Die erste ist Resume Next. Dabei wird direkt nach der Zeile
weitergearbeitet die den Fehler verursacht. Die andere ist Resume Sprungziel. Das entspricht
eigentlich einem Goto. Dann wird das Programm an einem Sprungziel weiter abgearbeitet.
Variante 1:
Basic
Sub Test
Anweisung ....
.... Exit Sub
Fehlerbehandlung:
Anweisung
Resume Next
End SubVariante 2:
Variante 1:
Basic
Sub Test
Anweisung ....
.... Exit Sub
Fehlerbehandlung:
Anweisung
Resume Weiter
Weiter:
Anweisung
End SubMit der Kombination von On error und resume Next kann man auf jegliche Fehlerbehandlung
verzichten. Dann wird einfach bei einem Fehler die nächste Zeile nach dem Fehler weiter
angearbeitet.
Basic
Sub Test
Anweisung
On Error Resume Next
Anweisung
Anweisung
End SubBeendet wird die Fehlerprüfung mit dem Befehl On Error Goto 0. Damit wird die
Fehlerbehandlung wieder ausgeschaltet.
Basic
Sub Test
On Error Resume Next
Anweisung
On Error Goto 0
Anweisung
End SubDa ein Programmier absichtlich keine Fehler programmiert, ist es mir etwas schwer
gefallen
ein Beispiel zu finden. Aber ich habe eines gefunden! Wir wollen eine Datei speichern, aber das
Verzeichnis existiert nicht, die Datei ist dort schon gespeichert oder der Name macht keinen
Sinn.
Also erstmal die Routine ohne Fehlerbehandlung.
Basic
Sub Speichern
dim args(0) as new com.sun.star.beans.PropertyValue
Dateiname = InputBox ("Geben Sie bitte den Dateinamen ein:")
Speicherort = InputBox ("Geben Sie bitte ein Verzeichnis ein:")
mydoc = ThisComponent
myUrl= Speicherort + Dateiname
mydoc.storeasurl(myurl,args())
End SubDie potientelle Problemzeile ist "mydoc.storeasurl.(myurl.args())". Beim
Aufruf dieser Zeile
kann ein Fehler auftreten wenn zum Beispiel das Verzeichnis zum Speichern nicht existiert.
Um diesen Fehler abzufangen machen wir in der einfachsten Version der Fehlerbehandlung nur
einen Sprung. Damit ignorien wir den Fehler einfach.
Basic
Sub Speichern
dim ........
......Dateiname
On Error Resume Next
mydoc.storeasurl(myurl,args())
End SubDiese Art der Fehlerbehandlung hat nur einen Nachtteil: Unser Programm reagiert nicht
auf den
Fehler. In unserem Beispiel wurde die Datei nicht gespeichert.
Also versuchen wir den Fehler jetzt abzufangen und eine Meldung darüber zu erzeugen.
Dazu
verwenden jetzt die Funktion goto in Kombination mit on error.
Basic
Sub SpeichernTest2
dim ........
......Dateiname
On Error Goto ErrorBehandlung
mydoc.storeasurl(myurl,args())
MsgBox "Datei gespeichert"
Exit Sub
ErrorBehandlung:
MsgBox "Speichern gespeichert"
End SubSo jetzt haben wir schon mal eine Trennung für Anwender. Er erfährt ob das Speichern
geklappt oder nicht. Wir können es aber noch besser. Wir verwenden den Errorcode den
StarOffice mit drei Funktionen erzeugt und geben eine Meldung über die mögliche
Fehlerursache aus.
Die Errorcodes werden von Starbasic nach einem Fehler bereitgestellt und können angezeigt
und ausgewertet werden.
Folgende Funktionen werden bereitgestellt:
Die Funktion Err übergibt die Nummer des aufgetretenen Fehlers.
Die Funktion Error$ stellt auch eine Beschreibung des Fehlers zur Verfügung.
Die Funktion Erl übergibt die Zeilennummer eines Fehlers.
Der einfachste Weg diese Meldung anzuzeigen ist eine Msgbox.
Basic
Sub SpeichernTest4
dim ....
....Sub
ErrorBehandlung:
MsgBox "Error " & Err & ": " & Error$ & " (Zeile : " & Erl & ")"
End SubBei einem ungültigen Dateinamen wird dann folgende Meldung erzeugt:

Das ist ja schon immerhin etwas. Jetzt haben wir eine Meldung. Damit können wir als
Programmierer etwas anfangen. Naja zumindestens manchmal. Aber für den Anwender ist uns
das zu wenig. Deshalb wollen wir noch zusätzlich die möglichen Fehler mit einen Text der
etwas mehr aussagt. Der Error 1 tritt immer dann auf wenn eine Exception ausgelöst wird.
Leider kann das bei einem falschen Dateinamen, bei vorhandener Datei mit schreibschutz, oder
ungültigen Verzeichnis auftreten. Diese Ursachen können wir aber angeben. Wenn mehrere
mögliche Fehlercodes gibt kann man für jeden ein eigene Meldung schreiben.
Basic
Sub SpeichernTest
dim ....
....Sub
ErrorBehandlung:
MsgBox "Error " & Err & ": " & Error$ & " (Zeile : " & Erl & ")"
If Err=1 then
MsgBox "Angabe führt zu einem Fehler" + myUrl +"Mögliche Fehler:" + Chr(13)+ _
"Dateiname und Verzeichnis falsch geschrieben" + Chr(13)+_
"Datei exitiert bereits und kann nicht überschrieben werden." + Chr(13)+_
"Das Verzeichnis exitiert nicht"
end if
End SubJetzt bekommt der Anwender eine aussagekräftige Meldung und kann seinen Fehler
korregieren.

Man sollte bei der Fehlerbehandlung daruf achten seine Proceduren und Funktionen
übersichtlich zu halten. Das ist am einfachsten wenn man die Fehlerbehandlungen an das
Ende setzt und vorher seine Routine abschließt. Ebenfalls sollte man auf Rücksprünge in das
ursprüngliche Programm verzichten. Dies ist wichtig für eine später Fehlersuche. Besteht
wirklich ein Bedarf das unter umständen noch bestimmte Aufrufe erfolgen sollen kann man
diese auch am Ende als Extracode für die Fehlerbehandlung einfügen. Der beste Weg dazu ist
die Anweisung erstmal ohne Fehlerbehandlung zu schreiben und entsprechend zu erweitern.
Basic
Sub Test
Anweisung
Anweisung
Anweisung
Anweisung
End SubJetzt kommt die Fehlerbehandlung dazu:
Basic
Sub Test
Anweisung
On Error Goto Fehlerbehandlung
Anweisung
Anweisung
Anweisung
Exit Sub
Fehlerbehandlung:
Anweisung
End SubAuf diese Weise bleibt der Code übersichtlich und man sieht soforft wo die eigentliche
Procedure aufhört und die Fehlerbehandlung anfängt. Dies ist vor allen sinnvoll wenn man auf
verscheidene Fehlerreagieren will oder sogar muss.
Basic
Sub Test
Anweisung0
On Error Goto Fehlerbehandlung1
Anweisung1
On Error Goto 0
Anweisung2
On Error Goto Fehlerbehandlung3
Anweisung3
On Error Goto 0
Anweisung
Exit Sub
Fehlerbehandlung1:
Anweisung
Fehlerbehandlung2:
Anweisung
End Sub