Programovanie makier v LibreOffice: Chyby (2)

LibreOffice Pokračujeme druhým dielom o chybách. Čakajú nás logické chyby, funkcia CVErr a príkaz On Error Resume Next.   

Logické chyby

Logické chyby narozdiel od predchádzajúcich typov chýb nemôže makro počas spustenia ani v behu vystopovať. Túto chybu môže určiť len človek. Napríklad, chceme sčítať dve čísla, ale očakávaného výsledku sa nedočkáme. Zisťujeme, kde a stala chyba a všimneme si, že miesto operátoru + je tam -. Formálne je všetko v poriadku a preto sa program nesťažuje. Avšak výsledok je chybný a nastala logická chyba.

1. príklad: Program na logické chyby

Sub example           REM začiatok procedúry
        Dim pole(1 To 5) As Integer  REM deklarácie premenných 
        Dim x As Integer

        x = 5   REM priradenie premenných
        pole(1) = 1
        pole(2) = 2
        pole(3) = 3
        pole(4) = 4
        pole(5) = 5

        Dim retazec As String

        For i = 1 To 5   REM cyklus
                retazec = retazec & "Obvod stvorca s hranou: " & pole(i) & " cm sa rovná " & pole(i)*x & " cm." & Chr(10)
        Next

        MsgBox retazec   REM výpis reťazca
End Sub   REM koniec procedúry

Výsledok programu Výsledok programu

Rozbor makra: Ak si spustite makro, všetko vyzerá v poriadku. Žiadna chyba ohľadne syntaxe vás neprekvapí. Rovnako beh a koniec makra je štandardný. Ale predsa, výsledok sa vám zdá byť podivný. Pretože viete, že obvod štvorca je 4*hrana, ako môže vyjsť obvod štvorca 5 cm pri 1 cm hrane? Je to chyba programátora, že priradil zlú hodnotu premenne x a očakávaný výsledok sa nedostavil. Tieto logické chyby vie ošetriť len programátor a zároveň následne zjednať nápravu.

Funkcia CVErr

S pomocou funkcie CVErr vieme zvoliť niekde počas behu programu, že nastala chybová situácia a v najlepšom prípade sa tejto situácii vyhnúť. Funkcia CVErr by mala vrátiť číslo zvolené programátorom a to číslo môže signalizovať, že nastal nejaký problém počas behu programu. Viac v ukážke programu.

2. príklad: Program na funkciu CVErr

Sub Example
        Dim pole(-3 To 3) As Integer 
        Dim x As Integer

        x = 6
        pole(-3) = 1
        pole(-2) = 2
        pole(-1) = 3
        pole(0) = 4
        pole(1) = 5
        pole(2) = 6
        pole(3) = 7

        Dim retazec As String

        For i = -3 To 3
                retazec = retazec & "Ideme delit: " & pole(i) & " s " & x & " sa rovna: " & pole(i)/x & Chr(10)
                x = x -1
                If x = 0 Then
                        x = CVErr(8)     REM využitie funkcie CVErr
                End If
        Next

        MsgBox retazec
End Sub  

Výsledok programu Výsledok programu

Rozbor makra: Začiatok programu je jasný, vykonáme deklaráciu premenných, pridáme hodnoty do poľa a začne cyklus. Delíme delíme až nastane situácia, že premenná x nadobudne hodnotu 0. Avšak deliť 0 sa nesmie! Nato sme pri navrhovaní programu mysleli, že môže takáto situácia nastať. Preto pridáme pre túto možnosť podmienku s tým, že priradíme s pomocou CVErr hodnotu premennej x a program sa predčasne neukončí. To je len jedna z možností využitia CVErr. Popravde, v tomto príklade sme ani nemuseli tam dávať túto funkciu, ale úplne by postačila hocijaká číselná hodnota. Ale i v tomto prípade to môžeme brať tak, že číslo 8 je pre vás definované ako chyba a hneď vo výstupe spoznáte, kde čo nastalo. Tých potencionálnych chýb môžu byť viacero a i podľa toho viete navrhnúť program.

Príkaz On Error Resume Next

Program vám beží, ale vy nechcete, aby bol kvôli chybe predčasne ukončený. Chybovú hlášku viete potlačiť príkazom On Error Resume Next. Program počas behu ignoruje len chyby run-time! Čiže len tie, ktoré vznikajú behom vykonávania programu. To znamená, že príkaz On Error Resume Next sa nevzťahuje na chyby syntaxu.

3. príklad: Program na príkaz On Error Resume Next

Sub Example
        Dim pole(-3 To 3) As Integer 
        Dim x As Integer

        On Error Resume Next   REM zablokujeme chybové hlášky

        x = 6
        pole(-3) = 1
        pole(-2) = 2
        pole(-1) = 3
        pole(0) = 4
        pole(1) = 5
        pole(24) = 6
        pole(3) = 7

        Dim retazec As String

        For i = -3 To 3
                retazec = retazec & "Ideme delit: " & pole(i) & " s " & x & " sa rovna: " & pole(i)/x & Chr(10)
                x = x -1
        Next

         MsgBox retazec
End Sub

Výsledek

Rozbor makra:

Inšpirovali sme sa druhým príkladom. Urobili sme dve zámerne chyby, prvá je presiahnutie mimo index definovaného rozsahu poľa a druhá chyba je delenie nulou. Ale zároveň sme pridali príkaz On Error Resume Next, ktorý zablokuje chybovú hlášku v prípade, že ide o run-time chybu.



(Jako ve škole) Průměr: 2.00 | Hodnotilo: 3
 

Komentáře

user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Chyby (2)
17. 05. 2017, 13:07:52
Řešení obsluhy chyb je poměrně složitá.

Příklad na CVErr je hooodně nepovedený. Funce CVErr slouží k informaci o chybě. V příkladu je použita nesmyslně. Její využití může vypadat následovně:

Sub Example
Dim pole(-3 To 3) As Integer
Dim x As Integer

x = 6
pole(-3) = 1
pole(-2) = 2
pole(-1) = 3
pole(0) = 4
pole(1) = 5
pole(2) = 6
pole(3) = 7

Dim retazec As String
For i = -3 To 3

retazec = retazec & "Ideme delit: " & pole(i) & " s " & x

d = Deleni(pole(i), x)
if iserror(d) then
if d = CVErr("Nula") then
retazec = retazec & " Nulou nedělíme!" & Chr(10)
else
retazec = retazec & " Nejde dělit!" & Chr(10)
end if
else
retazec = retazec & " sa rovna: " & pole(i)/x & Chr(10)
end if

x = x - 1
Next

MsgBox retazec
End Sub


function Deleni(a as variant, b as variant) as variant

on error goto Chyba
Deleni = a / b
exit function

Chyba: ' Funkce končí korektně ale hodnota signalizuje chybu
if b = 0 then
Deleni = CVErr("Nula")
else
Deleni = CVErr("Jiná chyba")
endif
end function

Příklad použití RESUME NEXT ve spojení ON ERROR se řadí k nejhorší praxi programátora. Program doběhne a nevaruje, že je něco špatně.

Jeho použití by mělo být omezeno jen na nezbytnou část kódu. Příkaz zároveň nuluje proměnnou ERR a je vhodné následně tuto proměnnou zkontrolovat.

Mimochodem, jeho platnost se ukončuje ON ERROR GOTO 0.

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz