Přerušení cyklů a maker

programovani.png Máte spuštěný cyklus, který určeným způsobem mění proměnnou nebo provádí jiné příkazy. Pokud vám vyhovuje, co cyklus do teď vykonal, a nepotřebujete nechat dojet cyklus do konce, můžete ho přerušit.  

EXIT

Pokud chcete přerušit cyklus nebo makro, musíte programu určit, kdy má toto přerušení provést. Určení provedete zapsáním příkazu exit na příslušném místě. Pokud chcete přerušovat pouze za určitých podmínek, zasaďte příkaz do vyhodnocení podmínky (viz Kód pro text_exit). V okamžiku, kdy je podmínka splněna, se cyklus přeruší.

Například:

sub text_exit
dim cislo as integer, cislo2 as integer
cislo = inputbox("Zadejte číslo 1 – 10")
cislo2 = inputbox("Zadejte druhé 1 – 10")
do while cislo < 10
cislo = cislo + 1
if cislo = cislo2 then
exit do
endif
print cislo
loop
end sub

Pokud zadáte první číslo menší než druhé, bude se provádět cyklus do té doby, dokud si nebudou obě čísla rovna. Naopak, když bude druhé číslo menší, provede se cyklus bez přerušení až do splnění podmínky, tedy do 10.

Stejně můžete použít příkaz EXIT i v FOR NEXT – zde zadáváte Exit For.

Možnosti příkazu EXIT jsou ještě větší a používá se například i Exit sub pro přerušení makra, Exit function pro přerušení funkce atd.

GOTO

Tento příkaz provede skok a přesune výkon makra na místo, které mu určíte tzv. "návěstím". Návěstí můžete zapsat i před příkaz goto, ale j e nutné ho označit dvojtečkou " navesti: " (bez uvozovek).

goto navesti
' příkazy
navesti:
' příkazy

TIP: není nutné mít návěstí zapsané za příkazem GOTO, můžete jej zapsat i před příkaz GOTO, dejte si ale pozor na spuštění nekonečné smyčky. Pro tento případ doporučuji provést test pomocí IF...THEN ve smyčce a případně EXIT SUB.

GOSUB RETURN

Tento příkaz má proti goto jednu obrovskou výhodu. Stejným způsobem přesune výkon makra na určené místo programu, ale navíc se dokáže i vrátit zpět a navázat na další průběh makra.

' příkazy 
gosub navesti
' příkazy – tady naváže makro po příkazu return
navesti:
' příkazy
return
end sub

Pro obsluhu maker jsou tyto funkce a příkazy základem a jejich znalost dokáže zásadně ulehčit a zrychlit práci.

Ošetření chyb v programu

Občas se stane, že váš program povede k chybě. Zpočátku asi často, ale to není případ, kdy je nutné nějak ošetřovat chybu. Mám na mysli chyby, které jsou nevyhnutelné – například se makro pokouší otevřít neexistující dokument apod. V tomto případě program hlásí chybu, zastaví se a otevře se Editor Basicu s označeným řádkem, kde program havaroval, a s jejím popisem. Takovou chybu můžete ošetřit několika způsoby.

Samozřejmě nebudete programovat makro, které povede k chybě. Může se ale stát, že makro pracuje s jinými dokumenty, které někdo omylem smaže. Takových situací může být samozřejmě více. Způsoby, které si ukážeme, zabrání havarování makra tím, že chybu vynulují nebo ji přímo napraví.

Příkaz k ošetření chyby vložte na začátek makra! Pokud dojde k chybě před definicí příkazu, k ošetření chyby nedojde.

ON ERROR GOTO

Princip je stejný jako u funkce GOTO s tím rozdílem, že se příkaz spustí pouze v případě chyby. V tomto případě si můžete zobrazit hlášení s jejím popisem.

TIP: V případě, že zadáte příkaz ve tvaru On Error GoTo 0, provede se vynulování chyby, to však neznamená, že bude chyba odstraněna!

On Error Goto hlaska
 ' příkazy, které vedou k chybě
hlaska:
print "Nastala chyba"
exit sub

ERROR

Tato funkce vrátí chybovou zprávu o chybě v programu. Následují další funkce, které slouží k identifikaci chyby.

ERR

Funkce Err vrátí chybový kód identifikující chybu, k níž došlo v programu. Tuto funkci si můžete přidat do oznámení chyby v příkazu On Error GOTO.

ERL

Funkce Erl vrátí číslo řádku, na kterém k chybě došlo. I tuto funkci můžete využít ve svém programu. Stačí si naprogramovat hlášku o chybě takto:

print "Nastala chyba: " & Err &" - "& Error$ & " : " &"na řádku č. " & Erl

Příklad výpisu chyby Příklad výpisu chyby

Tento výpis může pomoci při hledání místa a druhu chyby. Pozor: Erl vrací číslo řádku v Editoru Basicu, ne řádku v makru. Číslo řádku najdete v Editoru dole na stavovém řádku.

TIP: Doporučuji si ošetření chyby nastavit při vytváření delších maker.

ON ERROR GOTO … RESUME NEXT

Přidáním jednoduchého příkazu můžete vrátit běh makra tam, kde byl přerušen chybou. Tzn., že makro ohlásí chybu, přeskočí na příkaz k odstranění (GOTO) a vrátí se zpět, kde bylo přerušeno. V praxi můžete příkaz zapsat takto:

sub test_on_error
on error goto oprava
doc = thisComponent.sheets(0)
print "Ukončit makro "
exit sub
' případné příkazy pro manipulaci se sešitem
oprava:
print "Nastala chyba: " &; Err &;" - "&; Error$ &; " : " &;"na řádku č. " &; Erl
resume next
end sub

Pokud spustíte toto makro určené pro práci s Calcem ve Writeru, nahlásí program kód a druh chyby, číslo řádku, na kterém k ní došlo, a vrátí se zpět na řádek následující za nahlášením chyby.

ON ERROR RESUME NEXT

Další možností je vynechat příkaz GOTO a pokračovat ihned následujícím řádkem, to však můžete použít jen tehdy, kdy další příkazy a funkce makra nepovedou opět k chybě.

Pokročilé vyhledávání chyb

V některých kódech makra může být dohledání chyby i přes výše uvedené opatření složitější. Makro se totiž zastaví, když k chybě dojde, potřebujete ovšem odstranit příčinu chyby. Tato příčina může být na jiném řádku. Pro tyto případy poskytuje Editor Basicu nástroje, díky kterým můžete makro „krokovat“ řádek po řádku…

Na horní liště Editoru naleznete několik ikonek, které jste ještě nepoužívali. Vysvětleme, si k čemu slouží.

POZOR: všechny takto volané funkce začínají na začátku modulu. Pokud tedy nemáte makro zapsané jako první, přesuňte jej na začátek.

Krok procedury

Pomocí této ikonky můžete procházet spuštěným makrem krok po kroku. Makro se spustí a automaticky zastaví za další procedurou. Lze využít i klávesovou zkratku [SHIFT + F8].

Krok přes (krok procedury) Krok přes (krok procedury)

Krok dovnitř

Téměř stejně funguje další možnost Krok dovnitř. Spustí makro a zastaví za dalším příkazem. I zde můžete použít klávesovou zkratku [F8].

Krok dovnitř (jeden krok) Krok dovnitř (jeden krok)

Krok ven

Tento příkaz je opakem předchozích – vrací se zpět. Po kliknutí na ikonku se makro vrátí zpět na předchozí proceduru v aktuálním makru. Klávesová zkratka pro tento příkaz neexistuje. 

Krok ven (příkaz zpět) Krok ven (příkaz zpět)

Bod přerušení

Další výraznou pomocí je bod přerušení. Umístěte kurzor na řádek, na kterém chcete, aby se makro zastavilo (může jich být i více). Po spuštění makra se proces zastaví na takto označených řádcích. I toto můžete využít k lokalizaci chyby. Po stisknutí klávesy [F5] bude makro pokračovat až do konce, nebo do dalšího bodu přerušení.

Bod přerušení vložíte a odstraníte pomocí ikonky nebo klávesové zkratky [F9].

Krok přerušení (zastavení makra na určitém místě) Krok přerušení (zastavení makra na určitém místě)



Správa bodu přerušení



Po spuštění vyvolá dialogové okno pro správu bodů přerušení.

Správa bodů přerušení Správa bodů přerušení

Kukátko

Pod tímto „zajímavým“ názvem se skrývá další užitečná funkce Editoru. Kukátko, které musíte přiřadit k proměnné, sleduje její hodnotu po celou dobu běhu makra. I zde můžete použít vícenásobného výběru.

Kukátko Kukátko

Hodnoty proměnných uvidíte ve spodní části editoru v samostatném okně.

Okno kukátka Okno kukátka

Pro přidání proměnné do kukátka můžete použít klávesu [F7]. Odstranění se provádí v okně kukátka. Doporučuji kombinovat s výše zmíněnými metodami pro krokování makra.

V příštím díle si projdeme vstupní funkce. Ty se budou hodit při předávání hodnot do programu a pro řízení běhu programu (ne na základě podmínky, ale našeho rozhodnutí).

(Jako ve škole) Průměr: 1,31 | Hodnotilo: 13
 

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.

 
Soutěž - fólie Skinzone (SOL)
Daniel Sedláček

Daniel Sedláček

Amatérsky se věnuji programování maker od podzimu 2010.
Aktivní jsem na fóru od ledna 2011.
Od července 2011 spolupracuji i jako moderátor fóra.

Využívám pouze OpenOffice.org (LibreOffice nemám nainstalován).