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
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
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
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.