O spracovaní výnimiek pri manipulácii s výnimkami spoločnosti Delphi

Tu je zaujímavý fakt: Nie kód je bezchybný - v skutočnosti je nejaký kód úmyselne plný „chýb“.

Čo je chyba v aplikácii? Chyba je nesprávne kódované riešenie problému. Také sú logické chyby čo by mohlo viesť k nesprávnym výsledkom funkcie, keď sa všetko zdá pekne zostavené, ale výsledok aplikácie je úplne nepoužiteľný. S logickými chybami, prihláška môže alebo nemusí prestať pracovať.

Výnimky môžu zahŕňať chyby vo vašom kóde, keď sa pokúsite deliť čísla nulou alebo sa pokúsite použiť uvoľnené pamäťové bloky alebo sa pokúsite poskytnúť funkcii nesprávne parametre. Výnimkou v aplikácii však nie je vždy chyba.

Výnimky a trieda výnimiek

Výnimkou sú špeciálne podmienky, ktoré si vyžadujú špeciálne zaobchádzanie. Ak sa vyskytne chyba, program vyvolá výnimku.

Vy (ako autor aplikácie) zvládnete výnimky, aby vaša aplikácia bola náchylnejšia na chyby a aby reagovala na výnimočné podmienky.

Vo väčšine prípadov sa ocitnete ako autor aplikácie a tiež autor knižnice. Potrebujete teda vedieť, ako zvýšiť výnimky (z vašej knižnice) a ako ich zvládnuť (z vašej aplikácie).

instagram viewer

Článok o riešenie chýb a výnimiek poskytuje niekoľko základných usmernení o tom, ako sa chrániť pred chybami pomocou chránených blokov vyskúšať / vylúčiť / ukončiť a vyskúšať / konečne / ukončiť reagovať na výnimočné podmienky alebo zaobchádzať s nimi.

Jednoduchý pokus / s výnimkou ochranných blokov vyzerá takto:


vyskúšať
ThisFunctionMightRaiseAnException ();
leč// spracuje všetky výnimky uvedené v tejto funkcii ThisFunctionMightRaiseAnException ()
koniec;

ThisFunctionMightRaiseAnException môže mať vo svojej implementácii riadok kódu ako


raise Výnimka. Vytvoriť („špeciálna podmienka!“);

Výnimka je špeciálna trieda (jedna z mála bez T pred menom) definovaná v jednotke sysutils.pas. Jednotka SysUtils definuje niekoľko potomkov špeciálnych účelových výnimiek (a tak vytvára hierarchia tried výnimiek) ako ERangeError, EDivByZero, EIntOverflow atď.

Vo väčšine prípadov by výnimky, ktoré by ste riešili v chránenom bloku try / výnimkou, neboli výnimkou (základná) trieda, ale nejaká špeciálna trieda potomkov Výnimky definovaná buď vo VCL alebo v knižnici, ktorú ste použitím.

Zaobchádzanie s výnimkami pomocou vyskúšania / vylúčenia

Aby ste chytili a zvládli typ výnimky, zostavili by ste obsluhu výnimky typu „na type_of_exception do“. „Výnimočne platí“ vyzerá skoro ako v klasickom prípade:


vyskúšať
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// niečo pri vydelení nuloukoniec;
na EIntOverflow dobegin// niečo, keď je príliš veľké celé číslokoniec;
elsebegin// niečo, keď sa objavia iné typy výnimiekkoniec;
koniec;

Všimnite si, že druhá časť by chytila ​​všetky (ostatné) výnimky, vrátane tých, o ktorých nič neviete. Vo všeobecnosti by mal váš kód spracovať iba výnimky, ktoré skutočne viete zvládnuť a ktoré by mali byť vyhodené.

Nikdy by ste nemali „jesť“ výnimku:


vyskúšať
ThisFunctionMightRaiseAnException;
leč
koniec;

Jedenie výnimky znamená, že neviete, ako zaobchádzať s výnimkou, alebo nechcete, aby používatelia videli medzi nimi výnimku alebo niečo iné.

Keď spracujete výnimku a potrebujete z nej viac údajov (koniec koncov je to inštancia triedy), môžete urobiť iba typ výnimky:


vyskúšať
ThisFunctionMightRaiseAnException;
excepton E: Výnimka dobegin
ShowMessage (E.Message);
koniec;
koniec;

„E“ v „E: Výnimka“ je dočasná premenná výnimky typu zadaná za znakom stĺpca (v uvedenom príklade základná trieda výnimiek). Pomocou E môžete čítať (alebo zapisovať) hodnoty do objektu výnimky, napríklad získať alebo nastaviť vlastnosť Správa.

Kto oslobodí výnimku?

Všimli ste si, aké výnimky sú v skutočnosti prípady triedy zostupujúcej z výnimky? Kľúčové slovo zvýšenia vyvolá inštanciu triedy výnimky. To, čo vytvoríte (výnimkou je objekt), tiež vy potreba zadarmo. Ak vytvoríte inštanciu (ako spisovateľ knižnice), uvoľní ju užívateľ aplikácie?

Tu je Delphi mágia: Spracovanie výnimky automaticky zničí objekt výnimky. To znamená, že keď napíšete kód do bloku „okrem / konca“, uvoľní sa tak pamäť výnimiek.

Čo sa teda stane, ak táto vlastnosť ThisFunctionMightRaiseAnException vyvolá výnimku a nezaoberáte sa ňou (to nie je to isté ako „jej stravovanie“)?

A čo keď číslo 0 nie je spracované?

Keď sa v kóde vyvolá neošetřená výnimka, spoločnosť Delphi opäť Magicky spracuje vašu výnimku zobrazením chybového dialógového okna používateľovi. Vo väčšine prípadov tento dialóg neposkytuje dostatok údajov na to, aby používateľ (a nakoniec vy) pochopil príčinu výnimky.

Je to riadené slučkou správ najvyššej úrovne spoločnosti Delphi všetko Výnimky sú spracovávané globálnym aplikačným objektom a jeho metódou HandleException.

Ak chcete zvládnuť výnimky globálne a ukázať svoj vlastný užívateľsky prívetivý dialóg, môžete napísať kód pre TApplicationEvents. Obsluha udalosti OnException.

Všimnite si, že globálny aplikačný objekt je definovaný v jednotke Forms. TApplicationEvents je komponent, ktorý môžete použiť na zachytenie udalostí globálneho objektu Application.