Kaskadierung von Fehlermeldungen vermeiden
Hallo Forum,
nachfolgend ein stark vereinfachter Beispiel-Code, der in der Sub-Prozedur einen Fehler erzeugt.
Beim Starten der Main-Prozedur werden folgende Fehlermeldungen angezeigt:
„Fehler in Sub1“
„Fehler in Main“
Ist es möglich, dass die Main-Prozedur erkennen kann, dass in der Sub1 bereits eine Fehlermeldung erzeugt wurde, so dass nicht eine weitere Meldung angezeigt wird. Insbesondere bei verschachtelten Aufrufen ist das Ganze sonst für den Nutzer ziemlich lästig.
Vielen Dank im voraus,
Marco Born
nachfolgend ein stark vereinfachter Beispiel-Code, der in der Sub-Prozedur einen Fehler erzeugt.
Sub Main()
Try
Call Sub1()
Catch
MsgBox („Fehler in Main“)
End Try
End Sub
Sub Sub1()
Try
Dim i as Integer = 1/0
Catch
MsgBox („Fehler in Sub1“)
End Try
End Sub
Beim Starten der Main-Prozedur werden folgende Fehlermeldungen angezeigt:
„Fehler in Sub1“
„Fehler in Main“
Ist es möglich, dass die Main-Prozedur erkennen kann, dass in der Sub1 bereits eine Fehlermeldung erzeugt wurde, so dass nicht eine weitere Meldung angezeigt wird. Insbesondere bei verschachtelten Aufrufen ist das Ganze sonst für den Nutzer ziemlich lästig.
Vielen Dank im voraus,
Marco Born
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 377750
Url: https://administrator.de/forum/kaskadierung-von-fehlermeldungen-vermeiden-377750.html
Ausgedruckt am: 22.12.2024 um 13:12 Uhr
12 Kommentare
Neuester Kommentar
Moin,
das sieht eher nach VBA als nach VB.NET aus...
I.d.R. macht man das so, das man in den Sub()s innerhalb des Catches den lokalen Fehler behandelt und dann per throw (bzw. err.raise in VBA) den Fehler "nach oben" an den aufrufenden Code zurückgibt. Dort wird dann der komplette Stacktrace ausgegeben.
lg,
Slainte
das sieht eher nach VBA als nach VB.NET aus...
I.d.R. macht man das so, das man in den Sub()s innerhalb des Catches den lokalen Fehler behandelt und dann per throw (bzw. err.raise in VBA) den Fehler "nach oben" an den aufrufenden Code zurückgibt. Dort wird dann der komplette Stacktrace ausgegeben.
lg,
Slainte
so dass die Fehlermeldungen nicht alle nacheinander angezeigt werden.
Werden sie auch nicht. Darauf will ich doch hinaus. Da passiert dann in der Sub aber außerhalb des Try-Catch noch ein anderer Fehler. Lass Dir doch mitmsgbox ex.tostring
Ich weiß nicht, was Du da genau machst, dafür ist Dein Code-Ausschnitt zu kurz.
Aber bei mir liefert folgendes Bsp. genau eine Meldung:
Aber bei mir liefert folgendes Bsp. genau eine Meldung:
Sub Main()
Try
Call Sub1()
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Exclamation, ex.Source)
End Try
End Sub
Sub Sub1()
Try
Dim SB As Text.StringBuilder
SB.AppendLine("Hallo Welt!")
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Exclamation, ex.Source)
End Try
End Sub
Ja, Zeile 12. Das habe ich übersehen,, sonst hätte ich es genannt. Dieses "Throw" bewirkt, dass der Fehlerstack "weitergegeben" wird. Sprich, die Ausnahmen werden "nach oben" weitergereicht, also auch dem aktuellen Try-Catch-Block raus. Da in der Sub1 kein weiteres Try-Catch "drumherum ist", ist das "höhere" das aus der Sub Main.
Liege ich mit meiner Vermutung richtig, dass ich einfach die Throws überall entfernen muss?
Das kommt darauf an, was Du haben willst.Wenn Du willst, dass die Behandlung der Ausnahme mit den Aktionen in der "Sub1" erledigt sein soll, dann darf da kein Throw rein. Wenn Du aber willst, dass in der Sub1 zwar auf die Ausnahme reagiert wird aber dann trotzdem noch an die "höhere" Sub gemeldet werden soll, dann musst es drin lassen oder Du löst statt dessen eine neue, eigene Exception aus.