Výjimky
Chyby, na které upozorní překladač, nejsou jediné, které mohou v programu nastat. Daleko horší jsou chyby, které překladač nemůže odhalit, protože vznikají až za běhu programu a kterým říkáme run-time chyby (nebo běhové chyby). V okamžiku, kdy tato chyba vznikne, přeruší běh programu a dojde ke ztrátě dat. Jakmile tušíme, že by se v daném úseku programového kódu mohla taková chyba vyskytnout, je nutné všechny možnosti správně ošetřit.
Mechanismus výjimek
Mechanismus výjimek je postaven na čtyřech klíčových slovech:
- try – označuje začátek tzv. chráněného bloku, tj. bloku, ve kterém se očekává vznik výjimky a který se má zkusit provést.
- except – označuje konec chráněného bloku a uvádí příkazy pro obsluhu výjimek:
- finally – blok je proveden vždy, ať k výjimce dojde nebo ne. Používá se např. k uvolnění zdrojů alokovaných v bloku try předtím, než je obsloužena výjimka.
- raise – příkaz používaný k ručnímu vyvolání výjimky.
Blok except
Přesná syntaxe bloku except:
try
nebezpečné příkazy;
except
on typ očekávané výjimky do ošetření výjimky.
on typ očekávané výjimky do ošetření výjimky.
…..
else ošetření jiné (neočekávané) výjimky.
end;
V sekci else je možné ošetřit jakoukoliv výjimku, i tu, kterou jsme neočekávali a tedy nezařadili do výčtu on … do. Zpravidla je ale lepší nechat ošetření neznámé výjimky na implicitním handleru Delphi. Platí pravidlo, že buď výjimku identifikujeme a ošetříme, nebo ji necháme bez povšimnutí ošetřit Delphi.
Výjimka může být ošetřena v sekci do i více než jedním příkazem, tyto příkazy jsou pak standardně uvozeny klíčovými slovy begin a end.
Typy výjimek
EAbort | Tzv. tichá výjimka, která nevypisuje chybové hlášení a o jejíž existenci se uživatel nedozví. |
EAccessViolation | Nepovolený přístup do paměti. |
EConvertError | Chyba při provádění konverze (např. při použití funkce StrToInt, StrToFloat). |
EDivByZero | Celočíselné dělení nulou. |
ERangeError | Celočíselná hodnota mimo přípustný rozsah. |
EIntOverflow | Přetečení celočíselné operace, výsledek se nevejde do alokované oblasti. |
EInOutError | Vstupně/výstupní chyba, všeobecná výjimka pro chyby souborů. |
EInvalidPointer | Neplatná operace s ukazateli. |
EOutOfMemory | Neúspěšný pokus o alokaci paměti. |
EWin32Error | Třída pro chyby Windows. |
EZeroDivide | Dělení nulou v pohyblivé řádové čárce (reálných čísel). |
EOverflow | Přetečení v pohyblivé řádové čárce. |
EUnderFlow | Podtečení v pohyblivé řádové čárce. |
EInvalidOp | Nedefinovaná instrukce v aritmetice reálných čísel. |
Masky a komponenta MaskEdit
Slouží ke vstupu jedné řádky textu s kontrolou vstupních dat. Lze využít i pro formátování výstupu (zobrazení v požadovaném formátu). Základem je tzv. maska, která obsahuje předpis, jak data mají vypadat.
Vlastnosti
Vlastnost | Popis a použití |
EditMask | Slouží k zadání masky představující omezení vstupních dat pomocí Input Mask Editoru. |
Text | Vlastní text (zadaný uživatelem). |
EditText | Maskou formátovaný text tak, jak jej vidí uživatel. |
MaxLength | Maximální délka textu; automaticky se upravuje podle nastavení masky. |
IsMasked | Umožňuje testovat, zda maska byla definována. |
Ostatní vlastnosti a události jsou stejné jako u komponenty Edit.
Masku obvykle nevpisujeme přímo jako řetězec do vlastnosti EditMask, ale vytváříme pomocí Input Mask Editoru vyvolaného přes tuto vlastnost. Maska se skládá ze tří částí oddělených středníkem. První část obsahuje samotnou masku skládající se ze symbolů pro tvorbu masek. Druhá část určuje, zda se znaky masky budou ukládat společně se zadanými. Toto nastavení se týká pouze vlastnosti Text, neboť u vlastnosti EditText jsou znaky masky ukládány vždy. Pokud chceme ukládat pouze znaky zadané uživatelem, vložíme hodnotu 0, pokud i znaky masky, vložíme 1. Tuto hodnotu můžeme nastavit i pomocí položky Save Literal Characters v Input Mask Editoru. Třetí část masky říká, který znak bude v MaskEditu zobrazován jako místo určené pro vstup (standardně podtržítko). Znak je možné zadat i do položky Charakter for Blanks. Položka Test Input zobrazuje, jak bude editační pole vidět uživatel. Input Mask Editor obsahuje i některé jednoduché předdefinované masky v seznamu Sample Masks, ty ale většinou neodpovídají českým národním zvyklostem.
Symboly pro tvorbu masek
Symbol | Význam |
! | Odstranění počátečních mezer. |
> | Převede všechna následující písmena (až do symbolu <) na velká. |
< | Převede všechna následující písmena (až do symbolu >) na malá. |
L | Povinný alfabetický znak (malé nebo velké písmeno). |
l | Nepovinný alfabetický znak (malé nebo velké písmeno). |
A | Povinný alfanumerický znak (písmeno nebo číslice). |
a | Nepovinný alfanumerický znak (písmeno nebo číslice). |
C | Povinný libovolný znak (char). |
c | Nepovinný libovolný znak (char). |
0 | Povinná číslice. |
9 | Nepovinná číslice. |
# | Nepovinná číslice nebo znaky + či -. |
\ | Literál (za ním jinak speciální znak). |
: | Oddělovač hodin, minut, sekund (dle nastavení ve Windows). |
/ | Oddělovač dnů, měsíců, roků (dle nastavení ve Windows). |