Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Error zum Caller hinauf führen

Error zum Caller hinauf führen
21.05.2021 21:43:59
Frank
Hallo liebe Excel- und VBA-Gemeinde,
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

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Error zum Caller hinauf führen
24.05.2021 22:03:10
Frank
Hallo Trägheit!
Danke für den Link – das funktioniert!!!
Dass es auch so geht, habe ich gar nicht bedacht. Allerdings wäre es schön, wenn man die Einstellung Modul-bezogen setzen könnte – am besten mit VBA. Ich habe sowas mit Stack auslesen und verschiedenen On Error im Gedächtnis. Fällt Dir oder Anderen dazu nochwas ein?
Viele Grüße
Frank
Anzeige
AW: Error zum Caller hinauf führen
25.05.2021 10:39:01
Frank
Die Lösung von »Trägheit« funktioniert zwar auf den ersten Blick, hat aber – nach einigem Nachdenken – einen großen Nachteil:
Wenn ich eine Klasse für mich selbst entwickle, ist das ok. Wenn ich sie hingegen an eine:n Andere:n weitergebe, muss ich sie:ihn auffordern, die VBA-Option [Allgemein]→[Unterbrechen bei Fehlern] auf [Bei nicht verarbeiteten Fehlern] zu setzen. Das soll aber nicht sein. Das Ganze soll unabhängig von der VBA-Option funktionieren und man soll in der aufrufenden Prozedur selbst entscheiden können, ob man dort die Programmausführung anhält oder mit On Error Goto an einen Error-Handler weiterreicht.
Hier unten habe ich das nochmals für Property Let gelistet.

' Wenn Index >= 1 und  Count: Error
Public Property Let Wert(ByVal Index As Long, NeuerWert As Variant)
If Index  Col.Count Then
' Bei dem folgenden absichtlich erzeugten Error soll dieser bei der
' aufrufenden Zuweisung angezeigt und die Programmausführung dort
' anhalten werden.
On Error GoTo ErrorHandler
Err.Raise IndexError
On Error GoTo 0
End If
' Ab hier soll bei Errors die Programmausführung angehalten und der
' Error hier in der Klasse angezeigt werden.
If Index Then Col.Remove Index
If Index  0 And Index 
Viele Grüße
Frank
Anzeige
AW: Error zum Caller hinauf führen
25.05.2021 14:06:54
ChrisL
Hi Frank
Klassenprogrammierung ist nicht mein Steckenpferd, aber könntest du nicht eine Public Variable verwenden, um den Fehler weiter zu geben?
Vorausgesetzt du kannst die Input-Werte nicht vorgängig validieren, so dass es gar nicht erst zum Fehler kommt.

Public Property Let Wert(ByVal Index As Long, NeuerWert As Variant)
On Error GoTo errorhandler
If Index  Col.Count Then Err.Raise IndexError
If Index Then Col.Remove Index
If Index  0 And Index     Exit Property
errorhandler:
MyError = Err
End Property

Public MyError As Error
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."
            On Error Resume Next
.Wert(4) = "E"
If MyError Then
MsgBox Err.Description
Exit Sub
End If
On Error GoTo 0
End With
End Sub
cu
Chris
Anzeige
AW: Error zum Caller hinauf führen
25.05.2021 15:23:32
Frank
Hallo Chris,
vielen Dank für Deine Idee! Ja, ich könnte mit einer globalen Variablen arbeiten oder ich könnte statt Property Let eine Function benutzen, die bei Errors z.B. False oder Null zurückliefert.
Die besagte Klasse – die übrigens viel umfangreicher ist als mein Collection-Beispiel – schreibe ich allerdings nicht für mich, sondern für ein kleines Unternehmen, dessen Chef sich für VBA interessiert, dort seine ersten Schritte macht und die Klasse in ein bestehendes Projekt einbauen möchte. Dabei möchte ich es so bedienungsfreundlich wie möglich machen (deshalb mit Property Get/Let/Set) und vor allem möchte ich ihm anständige Errormeldungen an der richtigen Stelle zurückliefern, wenn er etwas falsch macht.
Ich weiß, dass das, was ich vorhabe, funktioniert, denn es ist mir schonmals unter die Finger gekommen. Das ist aber schon Jahre her und ich erinnere mich nicht mehr genau. Es war irgendetwas mit Ausführungs-Stack auslesen, damit Err.Source modifizieren und geschicktem Einsatz von On Error Goto, Resume und Err.Raise im Error-Handler in der Klasse. Ich habe auch schon gegooglet, aber es ist schwierig zu diesem Thema was zu finden (schon die passenden Stichwörter sind schwierig zu finden). Ich habe auch selbst schon vieles ausprobiert, aber nichts klappt wirklich.
Viele Grüße
Frank
Anzeige
AW: Error zum Caller hinauf führen
25.05.2021 15:43:25
ChrisL
Hi Frank
Meinst du vielleicht so:
https://stackoverflow.com/questions/50711866/how-to-properly-raise-errors-from-class

HandleErr:
' re-raise: add module and routine to originating error
Err.Raise Err.Number, "modTest.TestErrorLevel3" & vbCrLf & Err.Source, Err.Description
Also dem Error zusätzlich die Info zum Modul/Prozedur mitgeben, in welchem der Fehler aufgetreten ist.
cu
Chris
AW: Error zum Caller hinauf führen
25.05.2021 21:09:51
Frank
Hallo Chris,
das ist ein super Link - Errorhandling umfassend und kurz beschrieben! Ist zwar noch nicht genau das, was ich beabsichtige, geht aber in die richtige Richtung. Bin gespannt, ob das auch mit Klassen funktioniert.
Danke und viele Grüße
Frank
Anzeige
AW: Error zum Caller hinauf führen
26.05.2021 17:06:39
ChrisL
Hi Frank
Danke für die Rückmeldung. Freut mich, dass wenigstens mal die allgemeine Himmelsrichtung stimmt :-)
cu
Chris

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige