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.