Afhandelen van fouten is een essentieel onderdeel van programma code. Fouten die niet worden afgehandeld zijn voor de eindgebruiker natuurlijk vervelend (het programma stopt met werken), maar bepalen en opruimen van eventuele schade wordt daarbij ook niet gedaan. Een gemiste kans dus.
VBA biedt hiervoor de een aantal voorzieningen die in deze blogpost worden beschreven.
Allereerst: afvangen van foutsituaties
Fouten in programmacode kunnen worden opgevangen door een error handler in de code te voegen. Hiervoor worden de volgende commando's gebruikt:On Error Goto <ErrorHandlerLabel>: bij een foutsituatie, ga naar de code met label <ErrorHandlerLabel>
Resume (Next | <ErrorHandlerLabel>):
- Bij een foutsituatie, vervolg verwerking met de volgende code regel.
- Bij een foutsituatie, vervolg verwerking vanaf de code met label <ErrorHandlerLabel>.
On Error Goto 0: schakel afhandeling van de huidige foutsituatie uit.
Het error-object (Err)
Het error object bevat eigenschappen die een foutsituatie beschrijven en methods waarmee de foutsituatie. Dit object wordt automatisch gevuld wanneer zich een foutsituatie voordoet.
Voorbeeld:
Function VoorbeeldFunctie() As Integer
Dim a As Integer
On Error GoTo LabelErrorHandler
' ...code...
a = 1 / 0 ' Hier gaat wat fout, je mag niet delen door 0 (als voorbeeld).
VoorbeeldFunctie= 0
On Error GoTo 0
LabelCleanup:
' ...code...
Exit Function
LabelErrorHandler:
MsgBox ("Error (" & Err.Number & ") in ReportRun_Prepare(): " & Err.Description)
Resume LabelCleanup
End Function
Het error (Err) object wordt, binnen een error handling routine, na Exit Sub, na Exit Function, Exit Property, of Resume Next automatisch gereset (0). Dit kan ook expliciet gebeuren door Err.Clear te gebruiken, wat ook werkt buiten error handling routines.
Foutcodes
VBA gebruikt standaard nummers voor fouten. Daarnaast kunnen eigen foutcodes worden gebruikt. Gebruik hiervoor de foutcodes van 513 t/m 65535.Zelfgedefinieerde fouten kunnen worden geactiveerd (raised) door het raise commando, bijvoorbeeld: Err.Raise(513).
Geen opmerkingen:
Een reactie posten