Viser opslag med etiketten fejlhåndtering. Vis alle opslag
Viser opslag med etiketten fejlhåndtering. Vis alle opslag

søndag den 16. februar 2020

Bugs

LibreOffice er et meget kompliceret program, og der er masser af bugs (fejl). Der er en gruppe af personer, som på daglig basis visiterer og kategoriserer de indberettede bugs.

604 bugs, hvoraf 64 er forbedringsønsker, er indberettet i januar 2020 af 363 personer.

607 bugs blev visiteret i januar.

I januar er 555 bugs blevet markeret som løst.
I januar er 83 bugs blevet bekræftet og 222 bugs er blevet rettet.
Ubekræftede bugs er fejl, som ikke umiddelbart kan genskabes, og det er en stor opgave at forsøge at genskabe disse bugs.






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



Håndtering af fejl

I de tidligere artikler har jeg ikke gjort meget ud af at håndtere eventuelle fejlsituationer. I denne artikle ser vi på håndtering af meget konkrete fejlsituationer, som vi kan forudse.

En typisk situation som vi ALTID skal tage stilling til, er hver gang vi skal udføre matematisk division. Det kan nemlig meget let gå galt, hvis vi ikke først lige undersøger om vi har 0 (nul) i nævneren (det er forbudt at dele med nul). Et overordnet råd er derfor ALTID kontrolle nævneren før du udfører division.

Et andet eksempel er i artiklen Tekstdokumenters titel (læs artiklen her: https://libreofficedk.blogspot.dk/2016/12/tekstdokumenters-titel.html ), hvor jeg lavede følgende meget simple program:

Sub TitelFraFelt
oMaster = thisComponent.getTextFieldMasters().getByName("com.sun.star.text.fieldmaster.User.Titel")
thisComponent.DocumentProperties.Title = oMaster.Content
End Sub


Der er umiddelbart to situationer som vi bør tage stilling til:
  • Hvad nu hvis dokumentet ikke er et tekstdokument?
  • Hvad nu hvis feltet "Titel" ikke eksisterer?
Det første punkt bør vi altid kontrollere, når vi arbejder med makroer specifikke for tekstdokuemnter.

Denne lille rutine kontrollerer for om dokumentet er et tekstdokument:

If NOT ThisComponent.supportsService("com.sun.star.text.TextDocument") Then
  MsgBox "Det aktuelle dokument er ikke et Writer tekstdokument", 48, "Fejl"
  Exit Sub
End If


Det andet punkt kan vi løse vha. denne linje:

If thisComponent.getTextFieldMasters().hasByName("com.sun.star.text.fieldmaster.User.Titel") then

Makroen i artiklen kunne f.eks. se sådan ud:

Sub TitelFraFelt
rem Kontroller om det er et tekstdokument
If NOT ThisComponent.supportsService("com.sun.star.text.TextDocument") Then
  MsgBox "Det aktuelle dokument er ikke et Writer tekstdokument", 48, "Fejl"
  Exit Sub
End If
rem Kontroller om der findes et felt med navnet Titel
If thisComponent.getTextFieldMasters().hasByName("com.sun.star.text.fieldmaster.User.Titel") then
    oMaster = thisComponent.getTextFieldMasters().getByName("com.sun.star.text.fieldmaster.User.Titel")
    thisComponent.DocumentProperties.Title = oMaster.Content
    Else
      MsgBox "Feltet Titel findes ikke", 48, "Fejl"
    End if
End Sub