Wir hatten schon gesehen, dass bei einem Fehler
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 TXT For i = 0 To 1000 Err.Raise (i) Next Exit Sub TXT: 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: Eigentlich sind eigene Fehlernummern eher
für selbst erstellte 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.