| Startseite | Inhalt
StarBasic / OpenOffice.org Basic FAQ
Fragen und Infos: starbasic@dannenhoefer.de

Zurück Vor |
| 2.2.3 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. Sub Test Anweisung Anweisung On Error Goto Fehlerbehandlung Anweisung Exit Sub Fehlerbehandlung: Anweisung End Sub Zusä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: Sub Test Anweisung .... .... Exit Sub Fehlerbehandlung: Anweisung Resume Next End Sub Variante 2: Variante 1: Sub Test Anweisung .... .... Exit Sub Fehlerbehandlung: Anweisung Resume Weiter Weiter: Anweisung End Sub Mit 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. Sub Test Anweisung On Error Resume Next Anweisung Anweisung End Sub Beendet wird die Fehlerprüfung mit dem Befehl On Error Goto 0. Damit wird die Fehlerbehandlung wieder ausgeschaltet. Sub Test On Error Resume Next Anweisung On Error Goto 0 Anweisung End Sub Da 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. 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 Sub Die 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. Sub Speichern dim ........ ......Dateiname On Error Resume Next mydoc.storeasurl(myurl,args()) End Sub Diese 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. Sub SpeichernTest2 dim ........ ......Dateiname On Error Goto ErrorBehandlung mydoc.storeasurl(myurl,args()) MsgBox "Datei gespeichert" Exit Sub ErrorBehandlung: MsgBox "Speichern gespeichert" End Sub So 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 Funktioen 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. Sub SpeichernTest4 dim .... ....Sub ErrorBehandlung: MsgBox "Error " & Err & ": " & Error$ & " (Zeile : " & Erl & ")" End Sub Bei 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. 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 Sub Jetzt bekommt der Anwender eine aussagekräftige Meldung und kann seinen Fehler korregieren. Man sollte bei der Fehlerbehandlung daruf achten seine Proceduren und Funktioen ü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. Sub Test Anweisung Anweisung Anweisung Anweisung End Sub Jetzt kommt die Fehlerbehandlung dazu: Sub Test Anweisung On Error Goto Fehlerbehandlung Anweisung Anweisung Anweisung Exit Sub Fehlerbehandlung: Anweisung End Sub Auf 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 muß. 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 |
Seitenanfang |

2003 - 2009 von Michael Dannenhöfer |
Letzte Aktualisierung: 06.04.2009