Lösung: Was ist falsch an diesem Code? (1)
Das Problem an diesem Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | On Error Resume Next If MyFunction() Then MsgBox "MyFunction succedded" Else MsgBox "MyFunction failed" End If MsgBox "... continue execution ..." Function MyFunction MsgBox "Start MyFunction" On Error Goto 0 ' Just a failure here i = 1/0 MsgBox "End MyFunction" Test = true End Function |
ist, dass bei einem Fehler in der Funktion MyFunction die Funktion sofort abgebrochen wird. Nach diesem Fehler wird aber als nächste Zeile der Then Block ausgeführt. Die Funktion läuft also in den Bock “MyFunction succeeded” was nicht unbedingt im Sinne des Erfinders wäre.
Der Entwickler hat zwei Dinge nicht bedacht:
- Er wollte, das ein Fehler in MyFunction das Skript terminiert. Das erreicht er aber nicht. MyFunction wird bei einem Fehler abgebrochen, aber On Error Resume Next im nächsten äußeren Scope behandelt den Fehler.
- Dem Entwickler war unklar, dass On Error Resume Next bei einem Fehler in einem If Statement zum Ausführen des Then Blocks führt

Und man kann sich Denken was passiert wenn man eine While MyFunction() Schleife hat? Jaaaaa genau! Wird in MyFunction ein Fehler ausgelöst hat man eine perfekte Endlosschleife!
Am Besten also die Funktion nicht im If-Statement ausführen sondern das Ergebnis in einer Variable Speichern. Sofern die Variable zuvor empty war, ist sie es im Falle ein Fehlers hinterher auch, d.h. sie wird nicht verändert. Nach der Funktion kann man dann zusätzlich auch Err.Number prüfen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | On Error Resume Next Result = MyFunction() If Result Then MsgBox "MyFunction succedded" Else MsgBox "MyFunction failed" End If MsgBox "... continue execution ..." Function MyFunction MsgBox "Start MyFunction" On Error Goto 0 ' Just a failure here i = 1/0 MsgBox "End MyFunction" Test = true End Function |
Und was lernen wir daraus ![]()
On Error Resume Next ist tückisch und sollte möglichst sofort zurückgesetzt werden und schon gar nicht über den Scope einer eigenen Funktion hinaus verwendet werden.
Themenverwandte Beiträge:
Link für diesen Beitrag | RSS-Feed zu diesem Beitrag
Hinterlassen sie einen Kommentar:
Beachten sie bitte, dass Kommentare evtl. nicht sofort hier erscheinen. Die Kommentare werden zur Moderation an den Webmaster gesendet. Es kann also etwas dauern, bis Ihr Kommentar hier veröffentlicht wird!