Das Err-Objekt

Wir hatten schon gesehen, dass immer, wenn ein Fehler auftritt, das Err-Objekt reagiert: Das Err-Objekt besitzt das Raise-Ereignis, welches dann ausgelöst wird, und die Number-Eigenschaft verändert. Raise lässt sich als Methode auch manuell auslösen. Das Err-Objekt besitzt allerdings noch weitere Eigenschaften und Methoden. Besonders zu erwähnen ist die Description-Eigenschaft, die den Fehlertext enthält. Die folgende Prozedur zeigt nacheinander alle Fehler von 0 bis 1000 an, überspringt aber diejenigen Fehlernummern, für die kein Fehlertext definiert ist und daher „Anwendungs- oder objektdefinierter Fehler“ zurückgeben würde.

Sub Fehlertexte()
Dim i As Integer
On Error GoTo x:

For i = 0 To 1000
    Err.Raise (i)
Next

Exit Sub
x:
If Err.Description <> "Anwendungs- oder objektdefinierter Fehler" Then
    Debug.Print i, Err.Description
End If
Resume Next

End Sub

Mit Raise kann man auch eigene Fehlernummern erstellen. Im folgenden Beispiel verursacht die Funktion verursacheFehler auf jeden Fall einen Fehler. Fehlerinfo ruft diese Funktion auf und wenn dort ein Fehler auftritt, wird eine Nachricht mit einem individuellen Fehlercode aus verursacheFehler zurückgegeben.

Public Function verursacheFehler()
On Error GoTo FEHLER

verursacheFehler = 1 / 0

Exit Function

FEHLER:
Err.Clear
Err.Raise vbObjectError + 1000, "Funktion 'verursacheFehler'", "Sorry..."

End Function

Sub
Fehlerinfo() On Error GoTo INFO Debug.Print verursacheFehler Exit Sub INFO: MsgBox Err.Number & " - " & Err.Description, , Err.Source End Sub

Hier kommen neben Err.Number und Err.Description noch Err.Source und Err.Clear zum Tragen. Err.Clear setzt den Fehler wieder zurück auf „0“. Das passiert normalerweise automatisch bei Resume, Exit oder On Error. Hier wird aber schon vorher weitergearbeitet. Err.Raise setzt eine neue Fehlernummer, nämlich vbObjectError + 1000. Um nicht mit schon bestehenden Fehlernummern in Konflikt zu geraten, sollten nämlich eigene Fehlernummern negativ sein. Dafür stellt VBA die Konstante vbObjectError zur Verfügung, zu der man eigene Nummern hinzuzählen sollte. Wie der Name vbObjectError schon verrät: Anders als in diesem Beispiel sind eigene Fehlernummern eher für eigene Klassen gedacht. Deswegen gibt es auch die Err.Source Eigenschaft, die von Err.Raise als zweites Argument gesetzt wird. In einem Klassenmodul sollte hier der Name der Klasse eingetragen werden, so dass man erkennen kann, welche Klasse den Fehler verursacht hat. Das dritte Argument von Err.Raise setzt schließlich eine Description-Eigenschaft für die Fehlernummer.