Service: Visual-Basic 6.0 Tipps: Fehlerbehandlungscode


Diejenigen, die außer mit VB auch mit anderen Programmiersprachen arbeiten, kennen sicherlich die unangenehme Einschränkung von VB: Es gibt keine 'Try'-Konstruktion. Statt dessen müssen wir uns mit der für Puristen inakzeptablen 'On Error Goto'-Konstruktion herumschlagen. Sei es drum: Nach meiner Kenntnis ist es 'gute Praxis', Fehlerbehandlungscode zu schreiben, der in etwa wie folgt aufgebaut ist:


ErrorHandler:
    Select Case Err.Number
    Case 91 ' Objektvariable nicht gesetzt
        ' Erzeugen der Objektvariablen oder sonstwas
        ' ...
        Resume
    Case 500 ' Ein anderer 'behandelbarer' Fehler
        ' Fehler beseitigen
        ' ...
        Resume Next
    Case Else ' alle unvorhergesehenen Fehler
        sMSG = "Ein unvorhergesehener Fehler ist aufgetreten: "
        sMSG = sMSG & Err.Description & " (" & Err.Number & ")"
        MsgBox sMSG, vbException, "Fehler"
        Exit Sub
End Select

In Anbetracht meiner - in VB - eingeschränkten Möglichkeiten ist das doch auch OK so, oder? Nein! Doch! Nein! Warum nicht? Prüfen Sie doch bitte noch einmal diesen Fehlerbehandlungscode und überlegen Sie genau!

Was passiert, wenn in dieser Fehlerbehandlung z.B. im Abschnitt 'Case 91' ein Fehler auftritt? Genau: Das Programm stürzt gnadenlos ab! Sie werden jetzt sagen: 'Aber ein Fehler in der Fehlerbehandlung! So etwas gibt es doch gar nicht.' Wirklich nicht? Warum sollte irgend jemand davor sicher sein, einen Fehler in die Fehlerbehandlung einzubauen, wenn niemand davor sicher ist, einen Fehler in den 'normalen' Code einzubauen?

Ich empfehle eine andere Vorgehensweise:

1. Sichern Sie bereits Ihren 'regulären' Code gegen Fehler ab. Wenn Sie also damit rechnen müssen, dass Sie auf eine nicht instanziierte Objektvariable stoßen könnten (Fehler 91), dann prüfen Sie das, bevor Sie auf die Objektvariable zugreifen.

2. Halten Sie Ihre Fehlerbehandlung kurz! Gehen Sie davon aus, dass Ihre Fehlerbehandlung nur in wirklich unvorhergesehenen Fällen zum Tragen kommt (da Sie ja Ihren 'regulären' Code ausreichend abgesichert haben). Beispiel:

    Private Sub ReadFromObject()
    ' HINWEISE:
    ' MyObject ist eine globale oder modul-globale Objektvariable
    ' sMSG ist eine globale Zeichenkettenvariable
        On Error Goto ErrReadFromObject

        If MyObject Is Nothing Then
            Set MyObject = New CMyClass
            MyObject.Create
        End If

    ' Hier wird jetzt mit 'MyObject' gearbeitet
        With MyObject
            .DoThis
            .DoThat
            ' ...
        End With

        Exit Sub

    ErrReadFromObject:
        sMSG = "Error: " & Err.Number & " - " & Err.Description
        MsgBox sMSG, vbInformation, App.Title
    End Sub
 

Diese Vorgehensweise hat einen entscheidenden Vorteil: Da der Fehlerbehandlungscode einfach ist, wird es Ihnen nicht schwer fallen, ihn zu schreiben.

Oft genug sehen wir VB-Code ohne irgend eine Fehlerbehandlung und haben den Eindruck, dass viele Entwickler die Mühe scheuen, die mit einer umfangreichen Fehlerbehandlung verbunden ist. Insofern möchte ich jedem Entwickler empfehlen, lieber eine einfache aber vorhandene Fehlerbehandlung (wie im vorhergehenden Beispiel) in alle Routinen einzufügen, als ein geplante, aufwändige Fehlerbehandlung, die aber nicht wirklich vorhanden ist.

Übrigens: Meine 'VBExtensionTools' machen es Ihnen sehr leicht, einen Rahmen für eine Routine zu erstellen, der bereits eine Fehlerbehandlung in der oben beschriebenen Art enthält (oder vorhandene Routinen um eine solche Fehlerbehandlung zu ergänzen)! Darüber hinaus machen es Ihnen die VBExtensionTools auch sehr leicht, andere Mechanismen (wie z.B. für Fehlersuche und Fehlerbeseitigung) in Ihre Routinen aufzunehmen.

Seitenanfang

Kontaktaufnahme- und Terminvereinbarung:

Bei Fragen und für Terminvereinbarungen erreichen Sie uns unter:

0 63 49 99 07 38

0 151 51 95 34 00

Oder nutzen Sie das Kontaktformular




Ihr Ansprechpartner:


Hier sollte das Fahnungsfoto zu sehen sein.

Ralf Kunsmann

Spezialist für VBA-Programmierung
(alle Office-Anwendungen)
Entwickler der
VBA-Extension-Tools