- Startseite
- Neuigkeiten
- Über mich
- Referenzen
- Beispiele
- Artikel
- Vorträge
- Tools
- Access-Tipps
- Excel-Tipps
- Spielereien
- Kontakt
- Impressum
- Datenschutz
Meine Projekte:
Warum »On Error Resume Next« keine echte Fehlerbehandlung ersetzt
Eine Diskussion in XING und einige lange Fehlersuchen sind der Anlass für diesen kleinen Artikel über eine Nebenwirkung von On Error Resume Next, die auch mir bisher nicht so bewusst war.
Bei einer einfachen Prozedur ist die Verwendung kein Problem. Aber irgendwann wird daraus eine längere Prozedur und enthält dann womöglich auch einen Prozedur- oder Klassenaufruf. Und irgendwann läuft die aufgerufene Prozedur dann nicht mehr vollständig durch.
Die Ursache: Wenn die aufgerufene Funktion oder Klasse keine eigene explizite Fehlerbehandlung hat (ein On Error Goto 0 dort reicht nicht!) oder ein eigenes On Error Resume Next hat, dann wird bei einem Laufzeitfehler die Unterprozedur an der Stelle abgebrochen, an der der Fehler auftritt und die aufrufende Funktion wird weiter abgearbeitet.
Mit etwas Glück/Pech merkt man davon noch nicht einmal etwas. Das ist mir schon bei einigen fremden und sogar einer eigenen Anwendung passiert. Die Fehlersuche hat jeweils lange gedauert, das Einsetzen der Fehlerbehandlung (z. B. mit den MZ-Tools) nur einige Sekunden.
Code
Zum Ausprobieren hier der VBA-Code mit den (auch für mich) teilweise überraschenden Ergebnissen:
Public Sub sMain() On Error Resume Next Call sSub1 Call sSub2 Call sSub3 Call sSub4 MsgBox "Main" End Sub Public Sub sSub1() MsgBox 1 / 0 ' Abbruch MsgBox "Sub 1" End Sub Public Sub sSub2() On Error GoTo 0 MsgBox 2 / 0 ' Abbruch MsgBox "Sub 2" End Sub Public Sub sSub3() On Error Resume Next MsgBox 3 / 0 ' Weiter MsgBox "Sub 3" End Sub Public Sub sSub4() On Error GoTo sSub4_Error MsgBox 4 / 0 ' Fehlermeldung MsgBox "Sub 4" sSub4_Exit: Exit Sub sSub4_Error: Select Case Err Case Else MsgBox "Fehler " & Err.Number & " (" & Err.Description _ & ") in Funktion ""sSub4"" des Moduls ""Modul1""." _ , vbExclamation Resume sSub4_Exit End Select End Sub
