Error zum Caller hinauf führen
21.05.2021 21:43:59
Frank
ich habe ein Problem: In einer Klasse soll ein Error erzeugt werden, der beim Debuggen aber nicht dort, sondern beim aufrufenden Caller angezeigt werden soll. Ich weiß, dass das geht, aber erinnere mich nicht mehr daran, wie. Ich habe bereits Stunden rumprobiert, gegooglet und auch hier im Forum gesucht, finde aber keine funktionierende Lösung.
Ein einfaches Beispiel:
Es gibt ein Klassenmodul namens »DieKlasse«. Sie enthält als Beispiel eine Collection, der Werte hinzugefügt oder deren Werte geändert werden können. Das geschieht über Property Get und Property Let in der Klasse. Wenn der dazu anzugebende Index der Collection außerhalb des gültigen Bereichs ist, wird in der Klasse über Err.Raise ein entsprechender Error erzeugt.
Option Explicit
Private Col As Collection
Const IndexError = 9 ' Index außerhalb des gültigen Bereichs
Private Sub Class_Initialize()
Set Col = New Collection
End Sub
' Wenn Index >= 1 und Count: Error
Public Property Get Wert(ByVal Index As Long)
If Index Col.Count Then Err.Raise IndexError
Wert = Col(Index)
End Property
' Wenn Index >= 1 und Count: Error
Public Property Let Wert(ByVal Index As Long, NeuerWert As Variant)
If Index Col.Count Then Err.Raise IndexError
If Index Then Col.Remove Index
If Index 0 And Index
Zum Testen habe ich das folgende Modul:
Option Explicit
Public Sub Test()
Dim MeinObject As New DieKlasse
With MeinObject
.Anzeigen "Start", "Zuerst 2 Werte in die Collection schreiben..."
.Wert(0) = "A"
.Wert(0) = "B"
.Anzeigen "Gesetzte Werte", "Jetzt wird geändert und hinzugefügt..."
.Wert(1) = "X"
.Wert(2) = "Y"
.Wert(0) = "Z"
.Anzeigen "Geänderte und hinzugefügte Werte", _
"Jetzt kommt der Error, weil Col(4) geändert" & vbCr & _
"werden soll, das aber nicht existiert..." & vbCr & vbCr & _
"Leider wird der Error beim Debuggen in" & vbCr & _
"der Klasse angezeigt und nicht im Caller."
.Wert(4) = "E"
End With
End Sub
Gibt es dazu eine Lösung, die nicht diverse System-Aufrufe und Einbindungen benötigt?Anmerkung: Das hier ist nur ein Beispiel. Mir ist bewusst, dass sich die oben genannte Aufgabe auch anders lösen lässt. Das eigentliche Programm ist wesentlich komplexer und überprüft diverse Parameter, die bei Fehlern verschiedene Errors beim Caller erzeugen sollen.
Eine Beispiel-Datei habe ich hochgeladen: https://www.herber.de/bbs/user/146320.xlsb
Schonmal vielen Dank im Voraus und viele Grüße
Frank