DatenbankManufaktur

Anwendungen so individuell wie Ihr Unternehmen   –   Office- und VBA-Erfahrung seit 1995

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

Kurz gesagt: On Error Resume Next ersetzt keine echte Fehlerbehandlung und sollte nur für kleine Prozeduren oder begrenzte Code-Abschnitte eingesetzt werden.