| Selbstverständlich ist es kaum möglich, dass in einem Programm nie Fehler auftreten, man denke dazu nur an das CommonDialog-Steuerelement, das bei einem Klick auf "Abbrechen" automatisch einen Fehler auslöst, um zu signalisieren, dass der Anwender auf die Schaltfläche "Abbrechen" oder die Taste Escape gedrückt hat. Da ist es nicht wirklich gewollt, dass eine Fehlermeldung erscheint und das Programm abgebrochen wird. Und genau dazu gibt es in Visual Basic einige Kommandos, mit denen sich sogenannte Laufzeitfehler (Runtime-Errors) vermeiden lassen: Option Explicit Wenn in einem Code-Modul die Anweisung Option Explicit steht, so wird eine explizite Variablendeklaration erzwungen. Das heißt, dass der Compiler keine Variablen zulässt, die nicht deklariert wurden. Fehlt eine Variablendeklaration, so lässt sich das Projekt nicht kompilieren. Um diese Anweisung automatisch in jedem neuen Code-Modul hinzuzufügen, gibt es unter "Extras" -> "Optionen" das Kontrollkästchen "Variablendeklaration erforderlich". "Option Explicit" schützt nicht vor Schreibfehlern, diese Einstellung sorgt aber dafür, dass Schreibfehler auffallen, bevor ein unerwartetes Ergebnis auftritt. Neben "Explicit" gibt es noch einige weitere Zusätze für die "Option"-Anweisung, die hier aber nicht weiter behandelt werden sollen. On Error ... Das Kommando On Error ..., Fehler abzufangen, ohne dass die Anwendung unterbrochen wird. On Error Resume Next Mit diesem Kommando werden auftretende Fehler ignoriert und die Anwendung beim nächsten Befehl, der nach auf den fehlerverursachenden Befehl folgt, fortgesetzt. Der Entwickler ist selbst dafür verantwortlich, auf den aufgetretenen Fehler entsprechend zu reagieren. On Error Resume Next
Err.Raise CInt(20 * Rnd)
If (Err.Number = 0) Then
Debug.Print "Kein Fehler"
ElseIf (Err.Number < 10) Then
Debug.Print "Ein Fehlercode zwischen 1 und 9"
Else
Debug.Print "Ein Fehlercode größer gleich 10"
End If
Err.ClearListing 4: Beispiel für 'On Error Resume Next' On Error Goto [Sprungmarke] Tritt in der aktuellen Prozedur ein Fehler auf, so wird vom fehlerhaften Befehl zur ersten Befehl nach der Sprungmarke verzweigt. Ein Beispiel dafür wird später gezeigt. On Error Goto 0 Dies ist ein Sonderfall von "On Error Goto [Sprungmarke]". Mit diesem Kommando wird die in der Prozedur zuletzt festgelegte Fehlerbehandlung deaktiviert. In der IDE hat dies zur Folge, dass VB den Fehler meldet und die Ausführung stoppt. Wurde das Kompilat des Projektes ausgeführt und es tritt nach diesem Kommando ein Fehler auf, so wird die Anwendung beendet. On Error Goto -1 Auch dieses Kommando ist ein Sonderfall von "On Error Goto [Sprungmarke]". Tritt nämlich ein Fehler im Fehlerbehandlungsblock auf, dann wird die Anwendung unterbrochen. In der IDE erscheint der Dialog mit der Fehlermeldung, das Kompilat wird mit der Fehlermeldung beendet. "On Error Goto 0" kann da nichts ausrichten, es wirkt nicht. Mit "On Error Goto -1" kann man die vorgegebene Fehlerbehandlung für die Fehlerbehandlung außer Kraft setzen und eine Fehlerbehandlung für die Fehlerbehandlung implementieren. Ein Beispiel dazu gibt es bei www.aboutvb.de. Das Err-Objekt Mit dem Err-Objekt können Eigenschaften wie Fehlernummer, -beschreibung usw. gelesen, bzw. Fehler ausgelöst werden. - Number : Mit Err.Number (oder einfach "Err", da "Number" die Standardeigenschaft ist), kann die Fehlernummer eines Fehlers gelesen werden. Der Zahlwert Null bedeutet, dass kein Fehler aufgetreten ist.
- Description : In der Eigenschaft Description befindet sich eine Zeichenkette mit der Beschreibung des zuletzt aufgetretenen Fehlers. Ist Err.Number gleich Null, enthält Err.Description eine Zeichenkette der Länge Null.
- Source : Die Eigenschaft Source gibt den Namen des fehlerhaften Objekts zurück.
- Clear : Mit der Methode Clear werden die aktuellen Fehlerinformationen aus dem Err-Objekt entfernt.
- Raise : Mit Err.Raise kann man manuell einen Fehler auslösen.
Daneben gibt es noch drei weitere Eigenschaften, auf die wir hier jetzt aber nicht eingehen wollen. Resume [...] Mit Resume [...] kann man festlegen, wie die Arbeit nach der Fehlerbehandlung wieder aufgenommen werden soll. Außerdem wird das Err-Objekt zurückgesetzt. - Resume : Die Anwendung wird ab (und inklusive) dem Befehl fortgesetzt, der den Fehler ausgelöst hat. Dies ist z. B. bei Zugriffen auf Wechselmedien sinnvoll, um zu prüfen, ob ein Medium eingelegt wurde.
- Resume Next : Die Anwendung wird nach dem Befehl fortgesetzt, der den Fehler ausgelöst hat.
- Resume [Sprungmarke] : Die Anwendung wird beim ersten Befehl nach der angegebenen Sprungmarke fortgesetzt.
In Verbindung mit "On Error Goto [Sprungmarke]" wird die Fehlerbehandlung meist an das Ende einer Prozedur gestellt. Dabei wird Resume oft weggelassen, weil die Prozedur nach der Fehlerbehandlung sowieso beendet ist. Dies ist aber so nicht korrekt, da die Fehlerbehandlung nicht abgeschlossen wurde! Im Programmablauf macht es keinen Unterschied, es ist aber nicht sauber. Beispiel für eine Fehlerabsicherung Public Sub Main()
On Error Goto Fehler
Debug.Print 1 / 0
Call MsgBox("Weiter geht es", vbInformation)
Ende:
Call MsgBox("Schluss mit lustig", vbInformation)
Exit Sub
Fehler:
Select Case MsgBox("Fehler: " & vbNewLine & Err.Description & _
vbNewLine & "Was nun?", vbAbortRetryIgnore Or _
vbCritical)
Case vbAbort
Resume Ende
Case vbRetry
Resume
Case vbIgnore
Resume Next
End Select
End SubListing 5: Beispiel für manuelle Fehlerbehandlung |