lørdag den 10. december 2016

Mere om fejlhåndtering

Jeg har tidligere skrevet om fejlhåndtering i arktiklen "Håndtering af fejl" her: http://libreofficedk.blogspot.dk/2016/12/handtering-af-fejl.html

I den tidligere artikle beskrev jeg eksempler på håndtering af konkrete fejl, simpelthen ved at undersøge om en "ulovlig" situation er opstået, umiddelbart før en kritisk handling udføres. I denne artikel vil jeg komme ind på nogle af de indbyggede funktioner LibreOffice har til fejlhåndtering:
  • Erl: Linjenummer hvor seneste fejl opstod
  • Err: Fejlnummer for senestre opståede fejl
  • Error eller Error(error_number): Fejlbesked (tekst) for seneste fejl eller for et specifikt fejlnummer
  • On Error:
  • On Error Resume Next: Ignorer fejl og fortsæt makroen.
  • On Error GoTo 0: Nulstil den aktuelle error handler.
  • On Error GoTo LabelName: Ved fejl gå til ...[etikket]
  • CVErr: Konverterer et udtryk til et fejlobjekt

Lad os se på et par eksempler:

Sub test1
  On Error Goto BadError

Print UBound(Array1)

BadError:
  If Err <> 0 Then
    Print err
    Print erl
    Print Error(err)
End if
End sub


Der vil opstå en fejl, da variablen Array1 ikke eksistrer og derfor ikke har et UBound. Linjen Print UBound(Array1) fejler.

BadError svarer:
  • 91 (Fejlnummer)
  • 36 (Linjenummer)
  • Objektvariabel ikke initialiseret. (Fejlbesked som tekst) .
Her er et lidt mere omfattende eksempel:

Sub ExampleError
  On Error Goto BadError        'Sæt error handleren op
  Print 1/ CInt(0.2)            'Udfør noget ulovligt

BadError:                       'Error handler starter her
  Dim s As String               'Akkumuler beskeden
  Dim oldError As Integer       'Fejlnummeret
  Dim lineNum As Integer        'Linjenummeret
  If Err <> 0 Then              'Tjek Err
    oldError = Err              'Gem fejlnummeret
    lineNum = Erl               'Gem linjenummeret
    s = "Før nulstillet error handler " & CHR$(10) &_
        "Fejlnummer " & Err & " opstod ved linjenummer " & Erl & CHR$(10) &_
        "Fjlbesked: " & Error() & CHR$(10)
  End If
  On Error Goto 0               'Nulstil error handler
 
  REM Nu er der ingen ting at vise
  s = s & CHR$(10) & "Efter nulstillet error handler:" & CHR$(10) &_
      "Fejlnummer " & Err & " opstod ved linjenummer " & Erl & CHR$(10)
     
  REM Use the saved information
  s = s & CHR$(10) & "Fejlinformation blev gemt i variable " & CHR$(10) & "så vi kan finde dem frem senere:" & CHR$(10) &_
      "Fejlnummer " & oldError & " opstod ved linjenummer " &_
      lineNum & CHR$(10) & "Fjlbesked: " & Error(oldError)
  MsgBox s, 0, "Error Handling"
End Sub