Soubor v Powerpointu...

(Na stránce se ještě pracuje)

Cvičení 4

Ošetření výjimek a chyb

Pro ošetření výjimek a chyb se v Delphi používají dvě podobné, navzájem se doplňující konstrukce. První z nich používá try-finally a výjimku neoznačuje jako obslouženou:

try

prikaz1;

prikaz2;

...

prikazN;

finally

dokonceni;

end;

Pokud v některém z příkazů prikaz1..prikazN vznikne chyba, dalšími příkazy se už nepokračuje. U konstrukce try..finally se skočí na příkaz dokonceni, který se provede a po něm se pokračuje příkazy za koncovým endem.

Jiná konstrukce je s try-except:

try

prikaz1;

prikaz2;

..

prikazN;

except

on Vyjimka1 do dokonceni1;

on Vyjimka2 do dokonceni2;

end;

U konstrukce try..except se skočí za slovo except a začnou se tam po řadě probírat jednotlivé možnosti on. U té možnosti, kde je splněn správný typ výjimky, se vykoná odpovídající dokonceni a výjimka se tím považuje za obslouženou. Pokud se žádné on nehodí na vzniklou výjimku, výjimka se v této konstrukci neobslouží; výjimka pokračuje do bloku, odkud byla tato část programu volána atd., dokud nedojde k obsloužení (na nejvyšší úrovni obsluhuje výjimky standardní obsluha Delphi).

Pokud chceme obsloužit všechny výjimky, použijeme on Exception, protože Exception je rodičovská třída všech výjimek, tudíž se hodí na jakoukoliv výjimku.

Pozor na to, že při ladění Delphi standardně zobrazují chybový dialog i přesto, že je už výjimka obsloužena. Chceme-li toto chování vypnout, musíme v menu Tools-->Debugger Options-->Language Exceptions vymazat zaškrtnutí v políčku Stop on Delphi Exception.

Řešené příklady

Vyzkoušejte vnořování bloků try-except a try-finally a jejich chování. Vytvořte proceduru P1, ze které se volá P2 a z ní dále P3. Uvnitř P3 vyvolejte výjimku. Vyzkoušejte:

  1. Vytvoření výjimky a uživatelem definované výjimky.
  2. Prosté zachycení výjimky v P3.
  3. Proveďte obsluhu jedné výjimky v P3.
  4. Výjimku, která vznikla v P3, zachyťte a obslužte v P2.
  5. Výjimku sice obslužte v P2, ale nechte ji vyvolanou (resp. vyvolejte shodnou výjimku znovu), aby se mohla znovu zachytit v P1. Tato konstrukce se často používá k trasování chyb, aby se dalo vysledovat, jaké bylo pořadí vnořených procedur při vzniku výjimky, případně jaké hodnoty zrovna v procedurách byly.

Neřešené úlohy

(zde časem zapíšu několik neřešených příkladů ke zkoušce).

 Zadání k semestrální práci

Po tomto cvičení už byste měli mít ve všech formulářích a na všech kritických místech ošetřeny výjimky, což se bude příště klasifikovat.

Odkaz na seznam výjimek na stránkách DelphiBasics.

 

 Hook. Zprávy klávesnice, KeyPreview.

Událost "OnKeyPress" reaguje pouze na "rozumné" klávesy, tzn. vesměs na takové, které lze vytisknout. Ověřte si, že např. Edit nedokáže reagovat na klávesu PageUp.

Přesto taková potřeba někdy může nastat. Řešíme to tak, že se k zachycení zpráv nevyužije událost OnKeyPress, ale OnKeyDown nebo OnKeyUp (pracují ve dvojici). S jejich pomocí se dá zachytit řada jinak nedostupných kláves, jako jsou Shift, PageUp, šipky, Fxx, Enter a mnoho dalších.

Někdy se zprávy z klávesnice zachycují ještě uvnitř formuláře. To v případech, kdy chceme udělat nějakou činnost na úrovni formuláře a nikoliv na úrovni komponenty, která právě má fokus. K tomu účelu musíme ve formuláři nastavit vlastnost KeyPreview na hodnotu True. Tím se zapne zachycování zpráv od klávesnice. Tyto zprávy se přivádějí do handleru Form.OnKeyDown a teprve potom na příslušnou komponentu s fokusem. Kdybychom si například z nějakého mystického důvodu přáli, aby formulář při každém stisknutí klávesy zmodral, udělali bychom to takto. Všimněte si, že zprávy z klávesnice sice vyvolají akci ve formuláři, ale pak normálně pokračují do komponenty, která zrovna má focus. Pozor, KeyPreview nefunguje na navigační klávesy, tzn. na TAB, Shift+TAB a na šipky.

Poslední úlohou je zachytávání zpráv Windows - hook. Příklad hookování je zde. V tomto příkladu se po stisknutí tlačítka vloží do fronty zpráv zpráva, která simuluje stisk klávesy "A".

(příklad doplním později)