Naučte se programovat v Delphi (10. díl) - Výjimky - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Naučte se programovat v Delphi (10. díl) - Výjimky

30. listopadu 2001, 00.00 | Často v programech dochází k nejrůznějším chybám, kvůli kterým se program může zhroutit. V dněšním díle seriálu si představíme výjimky, které slouží k ošetření vzniklých chyb.

Často v programech dochází k nejrůznějším chybám, kvůli kterým se program může zhroutit. V dněšním díle seriálu si představíme výjimky, které slouží k ošetření vzniklých chyb.

Aplikace může být sebelépe naprogramovaná, ale když není ošetřena vůči předvídatelným chybám, může se kdykoliv shroutit.Takovéto chyby mohou vzniknout např. při zápisut na disk, který je zaplněn, při pokusu o dělení nulou atp. Výjimky nedokáží takovéto chyby předvídat, ale dokáží je ošetřit. Ošetřit znaméná, že program může pokračovat dál v chodu a nezhroutí se.

Runtimeové chyby

Dělení nulou, přetečení, podtečení hodnoty proměnné atd. jsou runtimeové chyby (run-in-time), tzv. chyby za běhu programu.

Runtimeové chyby se dělí na I/O chyby a fatální chyby. I/O chyby nastávají při vztupu a výztupu. Mezi ně patří třeba pokus o práci se souborem, který není otevřen, čtení procedurou read za koncem souboru apod. Dalším typem chyb jsou fatální chyby, které vždy okamžitě ukončí program. V aplikacích využívajících SysUtils jsou převáděny na výjimky. Mezi fatální chyby patří například již zmiňované dělení nulou (výjimka EDivByZero), neplatné přetypování (EInvalidCast), porušení přístupových práv (EAccessViolation) apod. Přehled všech chyb najdete v kompletní referenci k operačnímu systému.

Výjimky

Když víte, že se v nějakém useku kódu může vyskytnout nějaká nečekaná chyba, např. chyba při práci se soubory, měli byste toto místo ošetřit výjimkou. Základní typ výjimky se skládá z konstrukce try (zkus) a except.

try
  //příkazy
except
  //ošetření chyby
end;

Příkazy za except se provádějí jen při výskytu výjimky. Jakmile se po příkazu try vyskytne výjimka, skočí se hned do části za příkazem except a další příkazy se neprovádějí. Asi nejlepším příkladem využití výjimek je pokus o dělení nulou. Jak určitě každý ví dělit nulou nelze a kdybychom náš program vůči takové chybě neochránily shroutil by se. Nejprve si ukážeme, co se stane s programem, když potenciální chyba nebude ošetřena.

...
var i, k, l:real;
begin
  i:=0;
  k:=2;
  l:=k/i;
end;
...

Při běhu programu v Delphi vám debugger zobrazí toto hlášení o vzniku výjimky.

firstexception.gif (10473 bytes)

Možná to není moc čitelné (kvůli velikosti obrázku), ale toto dialogové okno nás informuje i o jménu výjimky, která vznikla. V tomto případě EZeroDivide, tedy dělení nulou. Toto okno zobrazí debugger Delphi a následující už sami windows při "normálním" běhu programu.

secexcept.gif (5549 bytes)

Jednotlivé třídy výimek mají schopnost zobrazovat dialogová hlášení o vzniku výjimky, ale naším úkolem je předejít zobrazení tohoto hlášení ošetřením výjimky pomocí try...except.

Formální deklarace toho jak by mělo takové ošetření výjimky vypadat vidíte v následující tabulce.

...
var i, k, l:real;
begin
  i:=0;
  k:=2;
try
  l:=k/i;
except
  on třída_výjimky do příkazy;
end;
...

Takže v praxi by to mělo vypadat nějak takhle.

...
var i, k, l:real;
begin
  i:=0;
  k:=2;
try
  l:=k/i;
except
  on EZeroDivide do ShowMessage('Vznikla výjimka dělení nulou!');
end;
...

Výsledek vypadá takto.

dalsi.gif (3331 bytes)

Program se neukončí a může se jet dál.

Try...finally

Konstrukce try...finally je hodně podobná předchozí variantě, ale rozdíl spočívá v tom, že příkazy po části finally se provedou vždy bez ohledu na vznik výjimky. Nejčastěji se tato varianta používá při práci se soubory nebo při připojování  a odpojování komponenty k/od serveru. Formální deklarace vypadá skoro stejně, takže ji zde nebudu uvádět. Vysvětlím to rovnou na příkladu.

...
var f:TextFile;
begin
  AssignFile(f, 'pokus.txt');
  ReWrite(f);
try

  WriteLn(f, 'neco');
finally
  CloseFile(f);
end;
...

Práci se soubory bude náplní příštího článku, ale vám postačí vědět, že příkazem rewrite vytvoříme nový soubor a příkazem writeln se do něj pokusíme něco zapsat. Pokud na disku nebude místo, tak vznikne výjimka, která přeruší běh programu, ale my ještě musíme ukončit práci se souborem příkazem CloseFile a ten je umístěn v části finally.

Raise

Příkaz raise dokáže výjimky vyvolávat, a proto se nám hodí tam, kde vznikne chyba ale nevyvolá se výjimka. To se hodí například v případě, kdy má uživatel zadat vstupní hodnotu a ta nesmí být větší než třeba 100, ale on se jí tam stejně pokusí zadat.

...
var j, k, l:Integer;
begin
  j:=StrToInt(Edit1.Text);
  if (j>100) then raise Exception.Create('Zadané číslo je větší než 100!');
end;
...

Chybové hlášení se bude zobrazovat tak dlouho, dokud uživatel nezadá správnou hodnotu.

Příště

Náplní příštího dílu seriálu bude práce se soubory.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: