O zpracování výjimek při zpracování výjimek Delphi

Zde je zajímavý fakt: Ne kód je bez chyb - ve skutečnosti je nějaký kód záměrně plný „chyb“.

Co je chyba v aplikaci? Chyba je nesprávně kódované řešení problému. Takové jsou logické chyby to by mohlo vést k nesprávným výsledkům funkce, kde se vše vypadá dobře, ale výsledek aplikace je zcela nepoužitelný. S logickými chybami aplikace může nebo nemusí přestat fungovat.

Výjimky mohou zahrnovat chyby v kódu, kde se pokusíte dělit čísla nulou, nebo se pokusíte použít uvolněné bloky paměti nebo se pokusíte poskytnout nesprávné parametry funkci. Výjimkou v aplikaci však není vždy chyba.

Výjimky a třída výjimek

Výjimkou jsou zvláštní podmínky, které vyžadují zvláštní zacházení. Když nastane podmínka typu chyby, vyvolá program výjimku.

Vy (jako autor aplikace) zvládnete výjimky, díky nimž bude aplikace náchylnější k chybám a bude reagovat na výjimečné podmínky.

Ve většině případů se ocitnete jako autor aplikace a také spisovatel knihovny. Musíte tedy vědět, jak zvýšit výjimky (z vaší knihovny) a jak s nimi zacházet (z vaší aplikace).

instagram viewer

Článek o řešení chyb a výjimek poskytuje několik základních pokynů o tom, jak se chránit před chybami pomocí chráněných bloků try / okrem / end a try / konečně / end, které reagují na výjimečné podmínky nebo je zpracovávají.

Jednoduchý pokus / s výjimkou ochranných bloků vypadá takto:


Snaž se
ThisFunctionMightRaiseAnException ();
až na// zpracovat všechny výjimky uvedené v ThisFunctionMightRaiseAnException () zde
konec;

ThisFunctionMightRaiseAnException může mít při implementaci řádek kódu jako


vyzdvihnout Výjimka. Vytvořit ('zvláštní stav!');

Výjimka je speciální třída (jedna z mála bez T před jménem) definovaná v jednotce sysutils.pas. Jednotka SysUtils definuje několik potomků výjimky pro zvláštní účely (a tak vytváří hierarchie tříd výjimek) jako ERangeError, EDivByZero, EIntOverflow atd.

Ve většině případů by výjimky, které byste zpracovali v chráněném bloku try / s výjimkou, nebyly výjimkou (základní) třída, ale nějaké speciální třídy potomků výjimek definované ve VCL nebo v knihovně, kterou jste použitím.

Zpracování výjimek pomocí funkce Try / Except

Chcete-li zachytit a zpracovat typ výjimky, vytvořte obslužnou rutinu výjimky "na type_of_exception do". „Výjimečně ano“ vypadá podobně jako klasické prohlášení o případu:


Snaž se
ThisFunctionMightRaiseAnException;
výjimka EZeroDivide dobegin// něco při dělení nuloukonec;
na EIntOverflow dobegin// něco při příliš velkém celočíselném výpočtukonec;
jinde// něco, když jsou vyvolány jiné typy výjimekkonec;
konec;

Všimněte si, že další část by chytila ​​všechny (jiné) výjimky, včetně těch, o kterých nic nevíte. Obecně by váš kód měl zpracovávat pouze výjimky, které skutečně víte, jak zacházet a očekávat, že budou hozeny.

Nikdy byste neměli „jíst“ výjimku:


Snaž se
ThisFunctionMightRaiseAnException;
až na
konec;

Jíst výjimku znamená, že nevíte, jak výjimku zacházet, nebo nechcete, aby uživatelé viděli výjimku nebo něco mezi tím.

Když vyřizujete výjimku a potřebujete z ní více dat (koneckonců jde o instanci třídy), pouze typ výjimky, kterou můžete udělat:


Snaž se
ThisFunctionMightRaiseAnException;
výjimka E: Výjimka dobegin
ShowMessage (E.Message);
konec;
konec;

"E" v "E: Exception" je dočasná proměnná výjimky typu zadaná za znakem sloupce (ve výše uvedeném příkladu základní třída výjimek). Pomocí E můžete číst (nebo zapisovat) hodnoty do objektu výjimky, jako například získat nebo nastavit vlastnost Zpráva.

Kdo osvobodí výjimku?

Všimli jste si, jak výjimky jsou ve skutečnosti příklady třídy sestupující z výjimky? Klíčové slovo zvýšit vyvolá instanci třídy výjimky. To, co vytvoříte (výjimkou je objekt), také vy potřeba zdarma. Pokud vytvoříte instanci (jako spisovatele knihovny), uvolní ji aplikace aplikace?

Tady je Delphi magie: Zpracování výjimky automaticky zničí objekt výjimky. To znamená, že když napíšete kód do bloku "kromě / konec", uvolní paměť výjimek.

Co se tedy stane, pokud ThisFunctionMightRaiseAnException ve skutečnosti vyvolá výjimku a vy se jí nezabýváte (to není totéž jako „jíst“)?

A co když není zpracováno číslo / 0?

Když je v kódu vyvolána neošetřená výjimka, Delphi opět magicky zpracovává vaši výjimku zobrazením chybového dialogu uživateli. Ve většině případů tento dialog neposkytuje dostatek dat, aby uživatel (a konečně vy) pochopil příčinu výjimky.

To je řízeno nejvyšší úrovní zpráv Delphi, kde Všechno výjimky jsou zpracovávány globálním objektem Application a jeho metodou HandleException.

Chcete-li výjimky globálně zpracovat a ukázat svůj vlastní uživatelsky přívětivější dialog, můžete napsat kód pro TApplicationEvents. Obsluha události OnException.

Všimněte si, že globální aplikační objekt je definován v jednotce Forms. TApplicationEvents je komponenta, kterou můžete použít k zachycení událostí globálního objektu Application.

instagram story viewer